Python Linux Netlink Recv缓冲区

Python Linux Netlink Recv缓冲区,python,linux,sockets,netlink,Python,Linux,Sockets,Netlink,当我从NETLINK路由套接字创建一个try tosocket.recv()时,如果我没有接收所有可用数据,则未接收的数据似乎丢失了 例如: >>> import socket >>> sock = socket.socket(socket.AF_NETLINK, socket.SOCK_DGRAM, socket.NETLINK_ROUTE) >>> sock.bind((0,0)) >>> sock.send('\24\

当我从NETLINK路由套接字创建一个try to
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)
如果I
sock.recv(100)
,它将返回100个字节,但+2900个其他字节已消失。执行另一个
sock.recv()
将返回下一个nlmsghdr(如果是多部分消息)或块等待数据

我可以
sock.recv(X,socket.MSG_PEEK)
读取X字节而不丢失数据;但在执行此操作时,读取的数据当然不会从recv缓冲区中弹出

我认为任何未读取的数据在读取之前都会保留在缓冲区中。我做错了什么?我不想只是“猜测”可能有多少数据可用…

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

Netlink提供数据报服务,您可以使用SOCK_DGRAM或SOCK_原始套接字


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

我只是不希望它以这种方式工作。我计划一次只从套接字缓冲区读取一条netlink消息。如果这是预期的行为(没有标志来改变它)我只是从我自己的缓冲区创建和读取。据我所知,您无法更改此行为。如果您确实需要在读取消息之前知道消息的确切大小,您可以查看nlmsghdr,您将看到数据包的长度。这是我的计划。问题是一个数据报中可能有多个MSG。读取
nlmsg\l第一个数据包的en
不包括同一数据报中任何其他MSG的大小。