套接字API是TCP/IP和UDP/IP通信(也就是我们所知道的网络编程)的事实标准。然而,它的核心函数之一accept()
有点神奇。
借用一个半正式的定义:
accept()
用于服务器端。 它接受了一个收到的进入尝试, 从远程客户端创建一个新的TCP连接, 并创建与该连接的套接字地址对关联的新套接字。
换句话说,accept
通过一个新的套接字返回给服务器,服务器可以通过该套接字与新连接的客户端进行通信。旧的套接字(在其上调用accept
)保持打开状态,在同一端口上监听新的连接。
accept
如何工作?如何实现?这个问题存在很多混淆。许多人声称accept
会打开一个新的端口并通过它与客户端进行通信。但这显然不是真的,因为没有打开新的端口。你实际上可以通过同一个端口与不同的客户端进行通信,但是怎样做呢?当几个线程在同一个端口上调用recv
时,数据如何知道去哪里?
我猜这是客户端的地址与套接字描述符相关联,每当数据通过recv
传输时,它就会被路由到正确的套接字,但我不确定。
深入了解这个机制的内部工作原理将是很好的。