Python Linux Netlink Recv Buffer

时间:2012-02-09 20:13:23

标签: python linux sockets netlink

当我从NETLINK_ROUTE套接字创建socket.recv()时,如果我没有收回所有可用数据,那么似乎没有收到的数据会丢失。

例如:

>>> 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)

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

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

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

1 个答案:

答案 0 :(得分:2)

这就是数据报(SOCK_DGRAM套接字)工作的方式 - 保留消息边界,当你不读取整个数据包时,其余部分被丢弃(SOCK_STREAM套接字,即TCP提供字节流服务,你可以在其中读取尽可能多的字节数想立刻,其余的将保存在套接字缓冲区中。)

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

问题是什么? AFAIK netlink有一个邮件大小的上限,您应该只使用它来接收邮件。