我正在连接服务器并发送消息。下面是简化的代码。服务器将首先以特定的确认消息响应,然后是实际响应
self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self._sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
self._sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self._sock.settimeout(0.1)
def ReqResp(self, msg, Addr=None):
self._UDSSend(msg, targetAddr = Addr)
return self._UDSRecv()
def _UDSRecv()
resp = self._sock.recv(1024)
# Extract payload from resp and check if it is an ACK (some parts excluded for brevity)
if payload == 'ACK':
resp = self._UDSRecv() # Got the ACK, now call again to get next response
我发现有时服务器响应速度如此之快,以至于ACK消息和实际的命令响应消息都被第一个recv()
收集。但是,我想一次抓住它们-有办法吗?我需要以其他方式配置我的套接字吗?
我知道我可以减小recv()
缓冲区的大小,但不能保证服务器将发送的内容(它可能会以ACK响应,也可能会发送我需要以其他方式处理的其他内容)。
Wireshark将ACK消息和命令响应视为单独的帧,因此我假设这是可能的,但不确定如何实现。
答案 0 :(得分:1)
不,这不可能。
TCP发送字节流。它不会将字节分成消息。它只发送字节,recv
得到一些正在等待的字节。如果您希望能够将字节分成消息,那就是您的工作。