我对C中的accept()
函数有疑问。
当服务器收到连接时,accept()
函数会创建一个与客户端通信的新套接字,然后让“旧套接字”侦听新连接。
然后,我明白服务器可以通过“新套接字”与客户端通信,但客户端如何与“新套接字”通信(因为客户端不知道这个“新套接字”)?
答案 0 :(得分:8)
在服务器端,侦听套接字仅与本地IP和端口关联,并处于LISTEN状态。
相比之下,服务器上接受的套接字(以及客户端上的连接套接字)由本地IP和端口以及远程IP和端口标识,并处于ESTABLISHED状态。
在客户端,服务器使用与连接套接字分开的侦听套接字并不重要。当客户端从connect
返回时,服务器已从accept
返回,并且每个服务器返回的套接字描述符可以相互通信。
答案 1 :(得分:3)
IP协议(包括TCP / IP)中的任何通信都发生在两个端点之间。端点始终是host:port。在TCP世界中,两个端点标识连接。套接字与连接关联,而不是与端点关联。
因此,您可以从2个accept()调用返回2个套接字,描述2个不同的连接。
以下是在unix机器上输出netstat -an
的示例:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 170.44.26.7:22 161.231.133.178:11550 ESTABLISHED
tcp 0 0 170.44.26.7:22 161.231.133.178:33938 ESTABLISHED
tcp 0 0 170.44.26.7:22 161.231.133.178:13875 ESTABLISHED
tcp 0 0 170.44.26.7:22 161.231.133.178:34968 ESTABLISHED
tcp 0 0 170.44.26.7:22 161.231.133.178:44212 ESTABLISHED
tcp 0 0 170.44.26.7:22 161.231.133.178:34967 ESTABLISHED
这里我们有一个监听套接字,以及由该套接字上的accept()
产生的一些连接(每个连接由它自己的套接字支持)。
答案 2 :(得分:1)
套接字是网络编程API的抽象。在线路和客户端上仍然只有一个连接,客户端不会看到服务器是否正在使用具有listen,accept等的网络API,或者服务器是否正在使用其他API或原始套接字来建立连接。
答案 3 :(得分:0)
解释是TCP(TCP / IP传输中的端点)由耦合IPaddress / port_number唯一标识。当客户端要求连接时,它使用其IP和端口号进行连接,这是一对唯一的。该操作将SRCIP + SRCPORT绑定到DSTIP + DSTPORT,这4个数字(两个IP加上两个端口)唯一地标识连接。所以服务器上的两个套接字实际上是指两个不同的连接/流。