Python-套接字一次只获取一条消息

时间:2020-08-20 09:24:01

标签: python sockets

我正在连接服务器并发送消息。下面是简化的代码。服务器将首先以特定的确认消息响应,然后是实际响应

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消息和命令响应视为单独的帧,因此我假设这是可能的,但不确定如何实现。

1 个答案:

答案 0 :(得分:1)

不,这不可能。

TCP发送字节流。它不会将字节分成消息。它只发送字节,recv得到一些正在等待的字节。如果您希望能够将字节分成消息,那就是您的工作。

相关问题