Будет ли запись байтов в NetworkStream TcpClient до того, как пульт будет настроен для чтения сброшенных байтов? - PullRequest
0 голосов
/ 07 мая 2019

Я настраиваю некоторые сокеты, натолкнулся на какое-то любопытное поведение, и мне было интересно, если это ожидалось.

У меня есть два потока на каждой стороне сокета.Авторы (по одному на каждой стороне) просто извлекают сообщения из очереди, сериализуют их, а затем записывают байты.Читатели (по одному на каждой стороне) читают заголовок и текст моего пользовательского протокола, десериализуют сообщение и запускают событие.

Достаточно просто, верно?

Интересное поведение, которое меня интересует, возникает, когда клиент подключается к серверу, а затем сразу пишет сообщение.Клиент может быть настолько быстрым, что к тому времени, когда клиент отправит сообщение, сервер не ускорил поток чтения.Если это произойдет, то сервер никогда не получит сообщение.Сообщения, отправленные после того, как поток чтения фактически вызывает Read (), успешно получены и обработаны.

Ожидается ли такое поведение?Ожидается ли, что Read () игнорирует байты, записанные в сокет до того, как что-либо будет считано на другой стороне?

1 Ответ

1 голос
/ 07 мая 2019

Нет, приемные буферы TCP создаются во время трехстороннего рукопожатия, при первом чтении будут видны все данные, отправленные до сих пор по соединению.

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

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

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