我有2个进程在通过TCP套接字进行通信的不同机器上运行。
这两个进程都具有既充当服务器又充当客户端的代码。
IE。 ProcessA 已打开在portX处绑定(bind)的服务器套接字,而 ProcessB 已在portY处打开了服务器套接字绑定(bind)。
ProcessA打开一个客户端套接字以与ProcessB连接,并开始以客户端身份发送消息
并接收响应(当然是通过相同的tcp连接)。
ProcessB收到消息并对其进行处理后,将发送响应,但也可以通过第二个tcp连接发送消息,即ProcessB在其中打开了到ProcessA的portX的客户端套接字。
因此,消息流是通过2个不同的tcp连接进行的。
我的问题如下:认为此“体系结构”不能更改,必须保持原样:
我有一个问题,断断续续地,消息是通过ProcessB打开了客户端套接字的tcp连接从ProcessB发送到ProcessA,到达消息是processA之前,消息是通过ProcessA作为客户端连接的tcp连接从ProcessB发送到ProcessA的响应 socket 。
IE。两种流都发生

(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)

编辑(在ejp请求之后)
在作为来自ProcessB服务器portY的答复发送的消息到达processA之前,如何执行/确保ProcessB不会通过ProcessB的客户端套接字打开到ProcessA的服务器portX的连接发送msg? IE。仅具有上述流程(1)。
请注意,processB是多线程的,处理过程很简单。

更新:
可能是我的误解,但是当进程通过套接字发送数据并将控制权返回给应用程序时,这并不意味着接收方已接收到数据。
因此,如果一个进程通过2个套接字发送数据,那么OS是否存在竞争条件?

UPDATE2
回答后,我从维杰·马修(Vijay Mathew)得到了:
如果我按照建议的方式进行了锁定,是否可以保证操作系统(即IP层)将按顺序发送数据? IE。完成一个传输,然后发送下一个?还是我会多路复用它们并遇到同样的问题?

谢谢

最佳答案

显而易见的解决方案是:

LockObject lock;

ProcessA ---->(msg)----> ProcessB(PortY)

// Processing the request and sending its response
// makes a single transaction.
synchronized (lock) {
    ProcessB does processing
    ProcessB(portY)--->(response)----->ProcessA (TCP1)
}

// While the processing code holds the lock, B is not
// allowed to send a request to A.
synchronized (lock) {
    ProcessB--->(msg)----->ProcessA(portX)  (TCP2)
}

10-04 14:18