Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 25, 2014 23:00:48

Paranoia_Agent
Зарегистрирован: 2014-06-25
Сообщения: 75
Репутация: +  5  -
Профиль   Отправить e-mail  

Как очистить буфер при передачи данных по TCP

Привет всем.
Собственно, суть проблемы в том, что автоматически не чистится буфер приемника.
Пример: посылаем какую-нибудь команду и в ответ получаем какое-то количество данных (например, мегабайт), которые записываем в файл (в примере: по 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 Июнь 26, 2014 09:26:38

flip89
От:
Зарегистрирован: 2011-10-21
Сообщения: 28
Репутация: +  2  -
Профиль   Отправить e-mail  

Как очистить буфер при передачи данных по TCP

У вас проблема в том, что отправитель в вашем случае передает 65535 байт, далее случается вылет по тайм-аут, так как из сокета больше нечего читать.



Офлайн

#3 Июнь 26, 2014 10:46:08

Paranoia_Agent
Зарегистрирован: 2014-06-25
Сообщения: 75
Репутация: +  5  -
Профиль   Отправить e-mail  

Как очистить буфер при передачи данных по TCP

Естественно, что отправитель ничего не шлет, если ему пришел от программы ACK, в котором черным по белому написано, что количество байт, которые можно принять, равно нулю. Смотрел в Wireshark'е.

Отредактировано Paranoia_Agent (Июнь 26, 2014 10:46:32)

Офлайн

#4 Июнь 26, 2014 11:01:51

flip89
От:
Зарегистрирован: 2011-10-21
Сообщения: 28
Репутация: +  2  -
Профиль   Отправить e-mail  

Как очистить буфер при передачи данных по TCP

а есть ли код сервера с которым вы работаете?



Офлайн

#5 Июнь 26, 2014 12:48:36

Paranoia_Agent
Зарегистрирован: 2014-06-25
Сообщения: 75
Репутация: +  5  -
Профиль   Отправить e-mail  

Как очистить буфер при передачи данных по TCP

Передачу обеспечивает микросхема WIZnet W3100, которая управляется ПЛИС. Физический уровень обеспечивает Realtek 8201. Там все работает идеально.

Офлайн

#6 Июнь 26, 2014 13:27:38

flip89
От:
Зарегистрирован: 2011-10-21
Сообщения: 28
Репутация: +  2  -
Профиль   Отправить e-mail  

Как очистить буфер при передачи данных по TCP

Хм, тогда могу сказать только то, что код приведенный выше работает так как и должен у меня на машине. Написал небольшой tcp сервер на tornado, который отправляет бесконечный поток байтов. Никаких проблем не возникает.



Офлайн

#7 Июнь 26, 2014 13:42:31

Paranoia_Agent
Зарегистрирован: 2014-06-25
Сообщения: 75
Репутация: +  5  -
Профиль   Отправить e-mail  

Как очистить буфер при передачи данных по TCP

Спасибо, будем заново проверять микросхемку.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version