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)
Isock.recv(100)
の場合、100バイトが返されますが、他の+2900バイトは失われます。別の操作を行うsock.recv()
と、次のnlmsghdr(マルチパートメッセージの場合)が返されるか、データの待機がブロックされます。
sock.recv(X, socket.MSG_PEEK)
データを失うことなくXバイトを読み取ることができます。しかし、そうするとき、もちろん、読み取られたデータはrecvバッファからポップされません。
読み取られなかったデータは、読み取られるまでバッファに残ると思いました。私は何が間違っているのですか?利用できるデータの量を「推測」するだけではありません...