Python Linux Netlink Recv Buffer - PullRequest
       7

Python Linux Netlink Recv Buffer

1 голос
/ 10 февраля 2012

Когда я создаю попытку 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)

Если я sock.recv(100), он вернет 100 байтов, но +2900 других байтов пропало.Выполнение другого sock.recv() вернет следующий nlmsghdr (если сообщение состоит из нескольких частей) или заблокирует ожидание данных.

Я могу sock.recv(X, socket.MSG_PEEK) прочитать X байтов без потери данных;но при этом считанные данные, конечно же, не выскакивают из буфера recv.

Я думал, что все не прочитанные данные останутся в буфере до чтения.Что я делаю неправильно?Я бы предпочел не просто «угадать», сколько данных может быть доступно ...

1 Ответ

2 голосов
/ 10 февраля 2012

Вот так работают дейтаграммы (сокеты SOCK_DGRAM) - границы сообщений сохраняются, а когда вы не читаете весь пакет, остальные отбрасываются (сокеты SOCK_STREAM, т. Е. TCP предоставляет сервисы потока байтов, где вы можете прочитать столько байтов, сколько высразу, остальные будут храниться в буфере сокетов).

Netlink предоставляет сервис дейтаграмм, вы можете использовать с ним сокеты SOCK_DGRAM или SOCK_RAW.

В чем проблема?AFAIK netlink имеет верхний предел размера сообщения, вы должны просто использовать его для получения сообщений.

...