Java Serversocket.accept()不按从客户端连接的顺序返回套接字? < >我们在java服务器和C++客户端之间创建2个连接。Java ServerSocket对象调用accept()两次,每次返回1个套接字;C++客户端调用连接()两次。我们假设accept()返回的第一个套接字的端口应该与调用connect()的第一个客户端套接字的端口相同,第二对套接字的端口相同

Java Serversocket.accept()不按从客户端连接的顺序返回套接字? < >我们在java服务器和C++客户端之间创建2个连接。Java ServerSocket对象调用accept()两次,每次返回1个套接字;C++客户端调用连接()两次。我们假设accept()返回的第一个套接字的端口应该与调用connect()的第一个客户端套接字的端口相同,第二对套接字的端口相同,java,sockets,port,sequence,connect,Java,Sockets,Port,Sequence,Connect,但是通过检查每个套接字上的端口号,我偶尔会看到异常情况,其中第一个套接字从accept()连接到第二个客户端套接字调用connect(),第二个套接字从accept()连接到第一个客户端套接字 在这里,服务器和客户端都是单线程的,用于建立连接。如何颠倒顺序?可以在网络上切换来自两个连接的初始同步数据包的顺序。例如,如果“第一个”连接的初始SYN数据包被丢弃,并且该数据包直到“第二个”连接的初始SYN数据包之后才重新发送。此外,即使服务器和客户端是单线程的,处理TCP堆栈的系统代码也可能是多线程的

但是通过检查每个套接字上的端口号,我偶尔会看到异常情况,其中第一个套接字从accept()连接到第二个客户端套接字调用connect(),第二个套接字从accept()连接到第一个客户端套接字


在这里,服务器和客户端都是单线程的,用于建立连接。如何颠倒顺序?

可以在网络上切换来自两个连接的初始同步数据包的顺序。例如,如果“第一个”连接的初始SYN数据包被丢弃,并且该数据包直到“第二个”连接的初始SYN数据包之后才重新发送。此外,即使服务器和客户端是单线程的,处理TCP堆栈的系统代码也可能是多线程的。

您不知道“从客户端连接的顺序”是什么。连接是一种具有数据包重试功能的三向握手。待办事项队列中的序列将是接收最终确认的序列,您对此一无所知。

我假设握手是在connect()返回之前完成的,因此丢弃的SYN和resent的处理应该在connect()返回之前完成。connect()返回之后的最终确认可以返回吗?如果不是,则最终确认的顺序应与connect()的顺序相同。最终确认从客户端发送到服务器;客户甚至不知道何时收到。