Коли я створюю спробу 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("24 22 1323 364O 21 ") # 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 має верхню межу розміру повідомлень, ви просто повинні використовувати це для отримання повідомлень.