У меня есть 2 процесса, выполняющиеся на разных машинах, которые обмениваются данными через TCP-сокеты.
Оба процесса имеют код, который действует как сервер, так и как клиент.
I.e. ProcessA открыл сокет сервера, который связывается с портомX и ProcessB открыл привязку сокета к серверу portY.
ProcessA открывает клиентский сокет для соединения с ProcessB и начинает отправлять сообщения как клиент и получает ответы (по одному и тому же соединению с tcp, конечно).
ProcessB, когда он получает сообщение и обрабатывает его, он отправляет ответ, но также может отправлять сообщение по второму подключению tcp, то есть где ProcessB открыл клиентский сокет для порта X ProcessA.
Таким образом, поток сообщений превышает 2 различных соединения tcp.
Моя проблема заключается в следующем: Принимая, как должное, что эта «архитектура» не может измениться, и должны оставаться как есть:
У меня есть проблема, что периодически, сообщения посылать из ProcessB в ProcessA через соединение TCP, что ProcessB имеет открыл клиентский сокет, дошел до процесса А до того, как сообщения отправили в качестве ответов от ProcessB на ProcessA по подключению tcp, которое ProcessA подключил как клиентский сокет.
I.e. Оба потока происходитjava сетевое программирование координация обмена сообщениями
(1)
ProcessA ---->(msg)----> ProcessB(PortY) (TCP1)
ProcessB does processing
ProcessB(portY)--->(response)----->ProcessA (TCP1)
ProcessB--->(msg)----->ProcessA(portX) (TCP2)
(2)
ProcessA ---->(msg)----> ProcessB(PortY) (TCP1)
ProcessB does processing
ProcessB--->(msg)----->ProcessA(portX) (TCP2)
ProcessB(portY)--->(response)----->ProcessA (TCP1)
EDIT (после запроса EJP) Как я могу применять/убедитесь, что ProcessB не посылает Сообщ через соединение, что ProcessB имеет сокет клиента, открытый для сервера PortX из ProcessA до сообщение посылает как ответ от сервера portY процесса ProcessB приходит к processA? То есть иметь только поток (1) из приведенного выше.
Обратите внимание, что processB многопоточен, а обработка является нетривиальной.
UPDATE: Может быть, это мое заблуждение, но когда процесс отправляет данные через сокет, и управление возвращается к применению, это не означает, что принимающая сторона получает данные. Итак, если процесс отправляет данные через 2 сокета, есть ли состояние гонки по ОС?
UPDATE2
После ответа я получил от Виджай Mathew:
Если бы я сделал замок, как предложено, есть гарантия того, что ОС (т.е. слой IP) будет передавать данные в порядке? То есть закончить одну передачу, а затем отправить следующий? Или я бы их мультиплексировал и имел такую же проблему?
Благодаря
Можете ли вы прояснить это? Вы имеете в виду, что B не должен отправлять * следующий запрос на A через портX, пока не поступит * предыдущий * ответ от A через порт X? так что порт Y здесь совершенно неактуальен? – EJP
@ejp: есть 2 соединения tcp. B не должен посылать msg в A через portX (открыт в A). Прежде чем ответ предыдущего сообщения (который был отправлен A-B, который прослушивал в portY), был получен A. Это более ясно? Поэтому portY не имеет значения. Это соединение tcp, на которое был отправлен первый msg от A. – Cratylus
Ваш пара, начинающийся как «я могу обеспечить», вообще не упоминает порт Y. Так что это не согласуется с тем, что вы только что сказали. Можете ли вы привести все это в соглашение, пожалуйста? Поэтому я понимаю, что B не должен посылать что-либо вниз по порту X, пока на порту Y ожидает ожидающий ответ. Верно ли обратное? – EJP