Блокировка Python recv возвращает меньше данных, чем запрошено - PullRequest
0 голосов
/ 16 сентября 2011

У меня есть эхо-сервер на C и тестовый клиент на Python.Сервер имеет ограниченный буфер чтения, например, 16 байт.Когда клиент отправляет более 16 байтов, он сначала читает 16, записывает обратно клиенту, а затем снова читает.

Я протестировал сервер с telnet и получил ту же строку, что и мои данные, даже если она длиннее 16 байт.Однако этот клиент Python не работает.

//data is initialized to be 20 bytes data
Len = 20
sock.setblocking(1)
sock.send(data)
recvdata = sock.recv(Len)
if(recvdata != data):
    print recvdata.encode('hex')
    print Len
    print data.encode('hex')

Этот клиент получает только первые 16 байтов, которые сервер записывает обратно.Журнал сервера показывает две записи (16 + 4).Вывод Python выглядит следующим образом

1234567890123456 //recvdata
20
12345678901234567890 //sent data

Я не уверен, почему это происходит, Почему блокировка recv() возвращает меньше данных, чем запрашивается?

1 Ответ

6 голосов
/ 16 сентября 2011

Длина, которую вы указываете recv, является максимальной, а не целью.Нет никакой гарантии, что recv будет ожидать получения Len байтов - он может вернуться, как только прочтет какие-либо данные.

Страница руководства для recv говорит: При получении вызовов обычно возвращаются любые доступные данные, вплоть до запрошенной суммы, вместо ожидания получения всей запрошенной суммы.

Если вам нужно прочитать определенное количество байтов, вам нужно позвонить recv в цикле и объединять возвращаемые пакеты до тех пор, пока вы не прочитаете достаточно.

...