Форум сайта python.su
5
Привет всем.
Собственно, суть проблемы в том, что автоматически не чистится буфер приемника.
Пример: посылаем какую-нибудь команду и в ответ получаем какое-то количество данных (например, мегабайт), которые записываем в файл (в примере: по 2 килобайта). Максимум, что может принять данная программа - 65535 байт, дальше - вылет по таймауту.
Теперь вопрос: существует ли какая-нибудь команда для удаления считанных данных из буфера приема, чтобы при вызове data = soc.recv() данные остались только в переменной data?
И да, маленький пример:
import socket file=open('D:\Bytes.e', 'ab') HOST = '192.136.0.2' PORT = 6946 soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) soc.settimeout(5) soc.connect((HOST, PORT)) soc.send('1') data = soc.recv(2048) while data: file.write(data) data = soc.recv(2048) file.close() soc.close()
Офлайн
2
У вас проблема в том, что отправитель в вашем случае передает 65535 байт, далее случается вылет по тайм-аут, так как из сокета больше нечего читать.
Офлайн
5
Естественно, что отправитель ничего не шлет, если ему пришел от программы ACK, в котором черным по белому написано, что количество байт, которые можно принять, равно нулю. Смотрел в Wireshark'е.
Отредактировано Paranoia_Agent (Июнь 26, 2014 10:46:32)
Офлайн
2
а есть ли код сервера с которым вы работаете?
Офлайн
5
Передачу обеспечивает микросхема WIZnet W3100, которая управляется ПЛИС. Физический уровень обеспечивает Realtek 8201. Там все работает идеально.
Офлайн
2
Хм, тогда могу сказать только то, что код приведенный выше работает так как и должен у меня на машине. Написал небольшой tcp сервер на tornado, который отправляет бесконечный поток байтов. Никаких проблем не возникает.
Офлайн
5
Спасибо, будем заново проверять микросхемку.
Офлайн