Когда я создаю попытку 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.
Я думал, что все не прочитанные данные останутся в буфере до чтения.Что я делаю неправильно?Я бы предпочел не просто «угадать», сколько данных может быть доступно ...