1

socket.recv()当我从 NETLINK_ROUTE 套接字创建尝试时,如果我不接收所有可用数据,似乎未接收到的数据丢失了。

例如:

>>> import socket
>>> sock = socket.socket(socket.AF_NETLINK, socket.SOCK_DGRAM, socket.NETLINK_ROUTE)
>>> sock.bind((0,0))
>>> sock.send('\24\0\0\0\22\0\1\3\23\0364O\0\0\0\0\21\0\0\0') # struct nlmsghdr
20
>>> sock.recv(10000)
'\xe4\x03\x00\x00 ... ' (+3000 more bytes)

如果 I sock.recv(100),它将返回 100 个字节,但 +2900 个其他字节消失了。做另一个sock.recv()将返回下一个 nlmsghdr (如果是多部分消息)或阻止等待数据。

我可以sock.recv(X, socket.MSG_PEEK)读取 X 个字节而不会丢失数据;但是当这样做时,读取的数据当然不会从 recv 缓冲区中弹出。

我认为任何未读取的数据都会保留在缓冲区中,直到读取。我究竟做错了什么?我宁愿不只是“猜测”有多少数据可用......

4

1 回答 1

2

这就是数据报(SOCK_DGRAM 套接字)的工作方式——消息边界被保留,当您不读取整个数据包时,其余部分被丢弃(SOCK_STREAM 套接字,即 TCP 提供字节流服务,您可以一次读取任意数量的字节,其余的将保存在套接字缓冲区中)。

Netlink 提供数据报服务,您可以使用 SOCK_DGRAM 或 SOCK_RAW 套接字。

问题是什么?AFAIK netlink 对消息大小有上限,您应该只使用它来接收消息。

于 2012-02-09T20:38:17.757 回答