这两个进程都有代码作为服务器和客户端。
例如,ProcessA已经打开了一个服务器套接字,绑定在端口X,而ProcessB已经打开了一个服务器套接字,绑定在端口Y。
ProcessA打开一个客户端套接字来连接ProcessB,并开始发送消息并接收响应(当然是通过相同的TCP连接)。
一旦ProcessB接收到消息并处理它,它会发送响应,但也可以通过第二个TCP连接发送消息,即ProcessB已经打开了一个客户端套接字连接到ProcessA的端口X。
因此,消息流通过2个不同的TCP连接。
我的问题是:假设这个“架构”不能改变且必须保持不变:
我遇到的问题是,间歇性地,从ProcessB发送到ProcessA的消息通过ProcessB打开的客户端套接字的TCP连接到达ProcessA之前,从ProcessB作为响应发送到ProcessA的消息通过ProcessA连接的客户端套接字的TCP连接到达ProcessA。
也就是说,两个消息流同时发生。
(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在从ProcessB的客户端套接字打开到ProcessA的服务器端口X发送消息之前,ProcessB不会通过连接发送消息,直到来自ProcessB的服务器端口Y的回复消息到达ProcessA?即只有上述流程(1)。
请注意,ProcessB是多线程的,并且处理过程并不简单。
更新:
也许这是我的误解,但当进程通过套接字发送数据并返回应用程序控制时,这并不意味着接收方已经接收到数据。
因此,如果一个进程通过2个套接字发送数据,操作系统是否存在竞争条件?
更新2:
在我得到Vijay Mathew的答案后:
如果我像建议的那样进行锁定,操作系统(即IP层)是否保证按顺序发送数据?即完成一个传输,然后发送下一个?还是它们将被多路复用并具有相同的问题?
谢谢