Как мне сбросить буфер клиента TCP, чтобы принять больше данных? - PullRequest
0 голосов
/ 11 октября 2010

У меня есть простой TCP-сервер и клиент. Клиент получает данные:

received = sock.recv(1024)

Это кажется тривиальным, но я не могу понять, как получить данные больше, чем буфер. Я попытался разделить данные на части и отправить их несколько раз с сервера (работал для UDP), но он просто сказал мне, что мой канал сломан.

Предложения

Ответы [ 3 ]

1 голос
/ 11 октября 2010

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

# Assumes a blocking socket.
while True:
    data = sock.recv(4096)
    if not data:
        break
    # Do something with `data` here.
1 голос
/ 11 октября 2010

Ответ Майка - тот, который вы ищете, но это не та ситуация, в которой вы хотите оказаться. Вам следует разработать протокол беспроводной связи, который использует поле фиксированной длины, которое описывает, сколько данных собираетсябыть отправленным.Это тип-длина-значение протокол, который вы найдете снова и снова и снова в сетевых протоколах.Это защищает ваш протокол от непредвиденных требований и помогает изолировать проблемы передачи по сети от программных.

Отправляющая сторона становится чем-то вроде:

socket.write(struct.pack("B", type)         #send a one-byte msg type 
socket.write(struct.pack("H", len(data))    #send a two-byte size field
socket.write(data)

А принимающая сторона что-то вроде:

type = socket.read(1)                                 # get the type of msg
dataToRead = struct.unpack("H", socket.read(2))[0]    # get the len of the msg
data = socket.read(dataToRead)                        # read the msg

if TYPE_FOO == type:
    handleFoo(data)

elif TYPE_BAR == type:
    handleBar(data)

else:
    raise UnknownTypeException(type)

В конечном итоге вы получаете формат беспроводного сообщения, который выглядит следующим образом:

struct {
     unsigned char type;
     unsigned short length;
     void *data;
}
0 голосов
/ 11 октября 2010

Имейте в виду, что:

  • Ваша операционная система имеет собственное представление о размере буфера сокета TCP / IP.
  • Максимальный размер пакета TCP / IP (обычно 1500 байт)
  • pydoc для сокета предполагает, что 4096 - это хороший размер буфера

С учетом сказанного, было бы действительно полезно увидеть код в этой строке. Есть несколько вещей, которые могут сыграть в это, если вы используете select или просто опрашиваете, неблокирует ли сокет и т. Д.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...