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)

Isock.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ネットリンクにはメッセージサイズの上限があります。メッセージを受信するにはそれを使用する必要があります。

于 2012-02-09T20:38:17.757 に答える