держать сокет открытым один раз и отправлять / получать сообщения несколько раз - PullRequest
1 голос
/ 24 июня 2011

Задача

У меня есть приложение C #, которое получает stream от клиента сокета , после получения потока мне нужно принять еще одно stream, отправленное клиентом,

Текущий код

   int length= this.DataSocket.Receive(this.buffer, this.buffer.Length, SocketFlags.None);

 // saves the first file ..... 

   length= this.DataSocket.Receive(this.buffer, this.buffer.Length, SocketFlags.None);

Детали

Я уверен, что я пишу данные из клиента сокета, но после получения первого файла 2-й DataSocket.Receive зависает , а stream не получено ... Есть идеи?

1 Ответ

3 голосов
/ 24 июня 2011

Сетевой поток в изоляции не имеет автоматического разделения сообщений - это всего лишь байты.Таким образом, необходимо разделить вручную; для записи удобнее всего использовать известный разделитель между записями.Самое удобное для чтения - это префикс каждого сообщения с количеством байтов для чтения в следующем сообщении.

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

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

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