我在java中看到了很多类似于这个问题的答案:"假设你在端口5000上有一个带有serversocket的服务器.客户端A和客户端B将连接到我们的服务器.
客户端A在端口5000上向服务器发送请求.客户端A端的端口由操作系统选择.通常,操作系统会选择下一个可用的端口.此搜索的起点是先前使用的端口号+ 1(因此,例如,如果操作系统最近发生在我们的端口45546上,那么操作系统将尝试45547).
假设没有连接问题,服务器接收客户端A在端口5000上连接的请求.然后,服务器打开其自己的下一个可用端口,并将其发送到客户端.在这里,客户端A连接到新端口,服务器现在再次使用端口5000."
我在stackoverflow上的多个问题中看到过这样的答案,关于如何在accept()的返回套接字中使用不同的端口而不是ServerSocket正在侦听的端口.我一直认为TCP是由四方信息识别的:
客户端IP:客户端端口和服务器IP:服务器端口 - >协议(用于区分TCP和UDP)
那么为什么accept()需要返回绑定到不同端口的套接字?在每个标头中发送的四重信息是否能够区分来自不同计算机的同一服务器端口的多个连接,而不需要在服务器计算机上使用不同的端口进行通信?
我的问题是基于以下理解
我试图实现我自己的服务器,其中 socket() 和 accept() 返回不同的套接字描述符值(是否总是这样?)。我的问题是为什么说如果服务器中没有打开新端口,accept() 会创建一个新套接字,并且 ip:port 对于 socket() 和 accept() 返回的套接字描述符是相同的。如果新套接字是由 accept() 创建的,它与 socket() 创建的套接字有何不同?