none
Перехват события при отправке данных TCP серверу RRS feed

  • Вопрос

  • Можно ли как то перехватить событие окончания передачи серверу поток байт? А то при передаче большого количества иногда получается так:

    Посылаем поток байт, (после этого сервер переходит в режим ожидания команды) и следом посылаем "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