Лучший отвечающий
Перехват события при отправке данных TCP серверу

Вопрос
-
Можно ли как то перехватить событие окончания передачи серверу поток байт? А то при передаче большого количества иногда получается так:
Посылаем поток байт, (после этого сервер переходит в режим ожидания команды) и следом посылаем "SIZEOFF" и в итоге в файле получается "Поток байтSIZEOFF", а сервер все продолжает ожидать блок байт для файла.
Или это можно только сделать при ответе сервера? Блок байт-ответ?16 февраля 2011 г. 17:17
Ответы
-
Класс NetworkStream обеспечивает методы для передачи и приема данных через сокеты Stream в блокирующем режиме. Используйте методы Write и Read для синхронного блокирования ввода-вывода простого одиночного потока.
Блокирующий - это значит, что будет происходить ожидание завершении фунции Write и значит самой передачи данных. И пока они не передадутся, код ниже Write выполняться не будет.
Для связи [mail]- Помечено в качестве ответа Abolmasov Dmitry 1 марта 2011 г. 17:13
18 февраля 2011 г. 1:31 -
Еще добавлю, что исходя из реальной практики для небольших объемов данных (до нескольких мегабайт) метод Write запишет все данные для отправки в системный буфер и тут же вернет управление. А непосредственно отправкой данных уже будет заниматься операционная система. В этом случае блокирующим (в масштабах более сотни миллисекунд) является только метод Read.
- Помечено в качестве ответа Abolmasov Dmitry 1 марта 2011 г. 17:13
18 февраля 2011 г. 13:48
Все ответы
-
Нет перехватить нельзя никак, сервер будет ждать всегда данных от клиента, пока тот, например не разорвет подключение. Поэтому вам нужно искать этот SIZEOFF флаг и по нему понимать, что все - передача закончилась. Или первым пакетом посылать размер, а потом ждать пока сервер не примет столько байт или больше (в этом случае придется выделить нужные).
Для связи [mail]17 февраля 2011 г. 11:32 -
Сервер будет ждать, я чуть чуть не так выразился. Я имел ввиду не на сервере окончание, а окончание процедуры или самого Write.
Public Sub SendData(ByVal data As String)
SyncLock My.Forms.General.YouClient.GetStream
Dim writer As New IO.StreamWriter(My.Forms.General.YouClient.GetStream)
writer.Write(data & vbCr)
writer.Flush()
End SyncLock
End Sub
нельзя проверить передает ли в данный момент StreamWriter данные или уже закончил?- Предложено в качестве ответа Abolmasov Dmitry 1 марта 2011 г. 9:35
- Отменено предложение в качестве ответа Abolmasov Dmitry 1 марта 2011 г. 11:54
17 февраля 2011 г. 13:19 -
Класс NetworkStream обеспечивает методы для передачи и приема данных через сокеты Stream в блокирующем режиме. Используйте методы Write и Read для синхронного блокирования ввода-вывода простого одиночного потока.
Блокирующий - это значит, что будет происходить ожидание завершении фунции Write и значит самой передачи данных. И пока они не передадутся, код ниже Write выполняться не будет.
Для связи [mail]- Помечено в качестве ответа Abolmasov Dmitry 1 марта 2011 г. 17:13
18 февраля 2011 г. 1:31 -
Еще добавлю, что исходя из реальной практики для небольших объемов данных (до нескольких мегабайт) метод Write запишет все данные для отправки в системный буфер и тут же вернет управление. А непосредственно отправкой данных уже будет заниматься операционная система. В этом случае блокирующим (в масштабах более сотни миллисекунд) является только метод Read.
- Помечено в качестве ответа Abolmasov Dmitry 1 марта 2011 г. 17:13
18 февраля 2011 г. 13:48