在编写TCP服务器时,我通常使用以下函数作为健壮的recv
函数:
def _recv(socket, size: int):
data = []
received = 0
while size != received:
chunk, _ = socket.recv(size - received)
data.append(chunk)
received += len(chunk)
return b''.join(data)
因此,如果recv
返回的字节数小于size
,它将继续接收,直到收到完整的消息。你知道吗
现在我正在编写一个UDP服务器,因为UDP是一个非流协议,我不能使用recvfrom
两次来读取同一个数据包,所以我使用如下代码:
def _recvfrom(socket, size: int):
return socket.recvfrom(size)[0]
从man 2 recvfrom
:
These calls return the number of bytes received, or -1 if an error occurred.
In the event of an error, errno is set to indicate the error.
我们知道recvfrom
可能只返回部分数据(假设UDP数据包是100字节,recvfrom
由于软件中断而返回50字节)。你知道吗
我的问题是,如何区分部分UDP数据包和从recv_from
接收的完整UDP数据包?或者更具体地说,如何区分由于软件中断而结束的recvfrom
和成功的recvfrom
?你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐