/ / Python Linux Netlink Recv Buffer - python, linux, sockets, netlink

Python Linux Netlink Recv Buffer - python, linux, sockets, netlink

Коли я створюю спробу socket.recv() з розетки NETLINK_ROUTE, якщо я не "повторюю ВСІ наявні дані, здається, дані не реквізуються" d втрачаються.

Наприклад:

>>> 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)

Якщо я sock.recv(100), він поверне 100 байт, але +2900 інших байтів більше немає. Робимо інше sock.recv() поверне наступний nlmsghdr (якщо повідомлення з декількома частинами) або заблокує очікування даних.

я можу sock.recv(X, socket.MSG_PEEK) читати X байт без втрати даних; але при цьому, прочитані дані, звичайно, не виходять із буфера recv.

Я думав, що будь-які нечитані дані залишаться в буфері до зчитування. Що я роблю неправильно? Я швидше не просто "здогадуюсь" про те, скільки даних може бути доступним ...

Відповіді:

2 для відповіді № 1

Ось так працюють дейтаграми (сокети SOCK_DGRAM) -Межі повідомлень зберігаються, і коли ви не прочитаєте весь пакет, решта відкидається (SOCK_STREAM розетки, тобто TCP надає послуги потокового байту, де ви можете прочитати стільки байтів, скільки хочете одразу, а решта зберігатиметься в буфері сокета ).

Netlink надає послугу дейтаграми, ви можете використовувати розетки SOCK_DGRAM або SOCK_RAW.

У чому питання? Мережа AFAIK має верхню межу розміру повідомлень, ви просто повинні використовувати це для отримання повідомлень.