套接字API是用于TCP / IP和UDP / IP通信的事实标准(即我们所知道的网络代码)。但是,它的核心功能之一accept()
是不可思议的。
借用半正式的定义:
在服务器端使用accept()。它接受从远程客户端创建新的TCP连接的传入尝试,并创建与此连接的套接字地址对关联的新套接字。
换句话说,accept
返回一个新的套接字,服务器可以通过该套接字与新连接的客户端进行通信。旧的套接字(在其上accept
被调用)保持打开状态,在同一端口上,侦听新的连接。
accept
工作如何?如何实施?在这个话题上有很多困惑。许多人声称接受会打开一个新端口,而您通过它与客户端进行通信。但这显然是不正确的,因为没有打开任何新端口。实际上,您可以通过同一端口与不同的客户端进行通信,但是如何进行呢?当多个线程recv
在同一端口上调用时,数据如何知道去向?
我想这是客户端地址与套接字描述符相关联的东西,每当有数据通过时,recv
它都会路由到正确的套接字,但是我不确定。
全面了解此机制的内部工作非常好。