Raf*_*ffi 1 python python-sockets
我目前正在实现以下代码,以将数据包发送到Parallels PVA XML API。我正在尝试将两个 XML数据包发送到服务器。第一个是指定用户凭据的登录数据包,第二个是包含有关API请求信息的数据包。这些数据包应该以空字节分隔\0。通常,服务器会发回多个数据包,第一个数据包是登录成功的说明,第二个数据包包含有关API请求的信息。
我遇到的问题是似乎第二个数据包没有被发送。我得到的唯一响应是第一个说明登录成功的数据包,但我没有得到包含有关API请求信息的数据包。我认为这可能是因为我要发送一个空字节,所以我尝试在base64中对所有内容进行编码,但最终得到了相同的结果。
因此,在我看来,要么连接被关闭,服务器没有足够的时间发送第二个数据包,要么由于空字节而完全忽略了该数据包。
任何帮助或评论将不胜感激。先感谢您!
import socket
import base64
def client(string):
HOST, PORT = '[IP_ADDRESS]', 4433
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(10)
sock.connect((HOST, PORT))
sock.send(base64.b64encode(string))
reply = sock.recv(131072)
sock.close()
return reply
packet = "<packet></packet>\0<packet></packet>"
print client(packet)
Run Code Online (Sandbox Code Playgroud)
请不要故意在数据包中没有信息,因为它包含敏感信息,并且ip地址被“ [IP_ADDRESS]”故意取代了
问题是,您尝试一次发送太多字节,并且\0将终止整个消息,因此其余部分从未发送过。我模仿了类似的客户端/服务器,这是响应:
...
import socket
from time import sleep
def client():
# I change second packet to 2packet for visually distinguish the packets
packet = "<packet></packet>\0<2packet></2packet>"
HOST, PORT = '127.0.0.1', 4433
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(10)
sock.connect((HOST, PORT))
while True:
try:
sock.send(packet)
sleep(1)
# this is the problem here
reply = sock.recv(131072)
if not reply:
break
print "recvd: ", reply
except KeyboardInterrupt:
print "bye"
break
sock.close()
return
client()
recvd: WelcomeOK...<packet></packet> # the null byte teminate the send and skip all remaining message
recvd: OK...<packet></packet>
recvd: OK...<packet></packet>
recvd: OK...<packet></packet>
...
Run Code Online (Sandbox Code Playgroud)
您会看到,2packet从未发送过,因为它被空字节终止,消息主体超过131072字节,比第二部分消息主体更长。
因此,要解决此问题,您只需要在每个循环上发送一个字节,那么空字节将仅终止自身,而下一个字节直到可以发送消息末尾为止:
... previous code
while True:
try:
sock.send(packet)
sleep(1)
reply = sock.recv(1)
if not reply:
break
print "recvd: ", reply
except KeyboardInterrupt:
print "bye"
break
sock.close()
return
client()
recvd: W
recvd: e
recvd: l
recvd: c
recvd: o
recvd: m
recvd: e
recvd: O
recvd: K
recvd: .
recvd: .
recvd: .
recvd: <
recvd: p
recvd: a
recvd: c
recvd: k
recvd: e
recvd: t
recvd: >
recvd: <
recvd: /
recvd: p
recvd: a
recvd: c
recvd: k
recvd: e
recvd: t
recvd: >
recvd: # <== this null byte terminates single byte send
recvd: < # <== and next loop it tries to send the next byte, goal achieved
recvd: 2
recvd: p
recvd: a
recvd: c
recvd: k
recvd: e
recvd: t
recvd: >
recvd: <
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20032 次 |
| 最近记录: |