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