Socket.Receive - где конец? - PullRequest
       13

Socket.Receive - где конец?

0 голосов
/ 23 декабря 2009

Я хочу получать данные от клиента. Если быть точным, все данные отправляет клиент. Но затем я хочу отправить некоторые данные обратно, чтобы не закрывать соединение.

Может быть, уже поздно ночью (по крайней мере, в Германии) - как я могу это сделать? Обычно я бы сказал, что в конце поставлю точку с запятой или что-то в этом роде, но такие протоколы, как HTTP, тоже этого не делают (или делают?). Как это там работает?

Спасибо, eWolf

Ответы [ 3 ]

4 голосов
/ 23 декабря 2009

При использовании протокола HTTP заголовок Content-Length используется для определения количества данных заранее.

Вы можете сделать что-то подобное в вашем протоколе.

3 голосов
/ 23 декабря 2009

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

TCP / IP - это потоковый протокол, не имеющий представления о том, насколько велико логическое / специфичное для приложения сообщение. Если вы не используете указание конца потока, упомянутое выше, вам нужно встроить свои собственные индикаторы в отправляемые вами данные. Это иногда упоминается как "создание". Например, отправитель может поставить перед данными префикс с количеством следующих байтов. Получатель сначала прочтет этот префикс и проверит, что это разумное число. Затем получатель вызывает прием в цикле, пока не будет получено столько байтов.

Хорошая информация о кадрировании доступна здесь: http://nitoprograms.blogspot.com/2009/04/message-framing.html

1 голос
/ 23 декабря 2009

Ищите нулевой терминатор (0), который может иметь разные размеры в зависимости от кодировки данных.

ASCII будет иметь нулевой терминатор в 1 байт.

...