Найти - Пользователи
Полная версия: Как очистить буфер при передачи данных по TCP
Начало » Python для новичков » Как очистить буфер при передачи данных по TCP
1
Paranoia_Agent
Привет всем.
Собственно, суть проблемы в том, что автоматически не чистится буфер приемника.
Пример: посылаем какую-нибудь команду и в ответ получаем какое-то количество данных (например, мегабайт), которые записываем в файл (в примере: по 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()
flip89
У вас проблема в том, что отправитель в вашем случае передает 65535 байт, далее случается вылет по тайм-аут, так как из сокета больше нечего читать.
Paranoia_Agent
Естественно, что отправитель ничего не шлет, если ему пришел от программы ACK, в котором черным по белому написано, что количество байт, которые можно принять, равно нулю. Смотрел в Wireshark'е.
flip89
а есть ли код сервера с которым вы работаете?
Paranoia_Agent
Передачу обеспечивает микросхема WIZnet W3100, которая управляется ПЛИС. Физический уровень обеспечивает Realtek 8201. Там все работает идеально.
flip89
Хм, тогда могу сказать только то, что код приведенный выше работает так как и должен у меня на машине. Написал небольшой tcp сервер на tornado, который отправляет бесконечный поток байтов. Никаких проблем не возникает.
Paranoia_Agent
Спасибо, будем заново проверять микросхемку.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB