/ / Python Linux Netlink Recv Buffer - Python, Linux, Sockets, Netlink

Python Linux Netlink Recv Puffer - Python, Linux, Sockets, Netlink

Wenn ich es versuche socket.recv() Wenn ich von einem NETLINK_ROUTE-Socket nicht ALLE verfügbaren Daten empfange, scheinen die nicht empfangenen Daten verloren zu gehen.

Beispielsweise:

>>> import socket
>>> sock = socket.socket(socket.AF_NETLINK, socket.SOCK_DGRAM, socket.NETLINK_ROUTE)
>>> sock.bind((0,0))
>>> sock.send("24221323364O21") # struct nlmsghdr
20
>>> sock.recv(10000)
"xe4x03x00x00 ... " (+3000 more bytes)

Wenn ich sock.recv(100)Es werden 100 Bytes zurückgegeben, aber die +2900 anderen Bytes sind weg. Einen anderen machen sock.recv() Gibt das nächste nlmsghdr zurück (wenn es sich um eine mehrteilige Nachricht handelt) oder blockiert das Warten auf Daten.

ich kann sock.recv(X, socket.MSG_PEEK) X Bytes zu lesen, ohne dass Daten verloren gehen; Aber wenn Sie dies tun, werden die gelesenen Daten natürlich nicht aus dem Empfangspuffer entfernt.

Ich dachte, dass alle nicht gelesenen Daten im Puffer bleiben, bis sie gelesen werden. Was mache ich falsch? Ich würde eher nicht nur raten, wie viele Daten verfügbar sein könnten ...

Antworten:

2 für die Antwort № 1

So funktionieren Datagramme (SOCK_DGRAM Sockets) -Nachrichtengrenzen werden beibehalten, und wenn Sie nicht das gesamte Paket lesen, wird der Rest verworfen (SOCK_STREAM-Sockets, dh TCP stellt Byte-Stream-Dienste bereit, bei denen Sie so viele Bytes lesen können, wie Sie möchten, der Rest wird im Socket-Puffer aufbewahrt ).

Netlink bietet einen Datagramm-Dienst an, mit dem Sie SOCK_DGRAM- oder SOCK_RAW-Sockets verwenden können.

Was ist das Problem? AFAIK-Netlink hat eine Obergrenze für die Nachrichtengröße. Sie sollten diese nur zum Empfangen von Nachrichten verwenden.