recvfrom时的部分UDP数据包

2024-03-29 10:12:05 发布

您现在位置:Python中文网/ 问答频道 /正文

在编写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?你知道吗


Tags: the函数datasizereturndeferrorsocket