C # TCPClient для быстрого сценария запроса-ответа - PullRequest
0 голосов
/ 17 сентября 2018

Во время моей последней задачи я испытывал определенное поведение при получении сразу после отправки в сеансе TCPClient, либо в режиме синхронизации, либо в асинхронном режиме.

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

Я также пробовал асинхронную модель, просто «используя без касания» MSDNсоответствующее руководство по программированию асинхронных клиентских сокетов.Код, представленный и связанный ниже, отправляет данные, ожидает завершения события отправки и использует сигналы ManualResetEvent для вызывающей стороны для продолжения вызова функции Receive ().Данные также теряются в этом сценарии.

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

Моя проблема затрудняет управление связью с платой автоматизации TCP в реальном времени, потому что моя функция приема перестает синхронизироваться одним вызовом:

[t=1] send(get_status);
[t=2] receive(); //LOST with no data, execution goes on without exceptions
[t=3] send(get_status);
[t=4] receive(); //Got previous answer

Я могу утверждать, что при t = 4 ответом является тот, который ожидается от t = 1 запроса, потому что запросы и последующие ответы помечаются идентификатором последовательности, который должен быть монотонно возрастающим целым числом.

Размещение Thread.Sleep (), кажется, решает проблемы вокруг, но я никак не могу решить свои проблемы, спя над ними.

Как это возможно, учитывая прекрасную теорию TCP?Как это можно решить и привести к детерминированному поведению?

Заранее благодарим за все ваши комментарии, предложения и решения.

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