【发布时间】:2010-10-04 02:14:51
【问题描述】:
套接字 API 是 TCP/IP 和 UDP/IP 通信(即我们所知道的网络代码)的事实标准。不过它的核心功能之一accept()有点神奇。
借用一个半正式的定义:
accept() 用于服务器端。 它接受收到的传入尝试 创建一个新的 TCP 连接 远程客户端,并创建一个新的 与套接字关联的套接字 此连接的地址对。
换句话说,accept 返回一个新的套接字,服务器可以通过它与新连接的客户端进行通信。旧套接字(在其上调用 accept)保持打开状态,在同一端口上侦听新连接。
accept 是如何工作的?它是如何实施的?关于这个话题有很多困惑。许多人声称接受打开一个新端口,您通过它与客户端通信。但这显然不是真的,因为没有打开新的端口。您实际上可以通过同一个端口与不同的客户端进行通信,但是如何?当多个线程在同一个端口调用recv时,数据怎么知道去哪里?
我猜这类似于客户端地址与套接字描述符相关联,每当数据通过recv 时,它都会被路由到正确的套接字,但我不确定。
如果能对这种机制的内部运作进行彻底的解释,那就太好了。
【问题讨论】:
-
因此对于每个客户端请求,都会在服务器端打开一个全新的套接字连接。服务器必须始终在 80 点打开以侦听来电。如果它收到一个调用,它会立即使用下面提到的四个元组创建一个新的套接字,这将在客户端和服务器之间建立一个 TCP 连接。我的理解正确吗?
-
这是一个非常基本的问题,我最近在一次采访中对此进行了测试:stackoverflow.com/questions/24871827/…如果您对此有任何 cmet,请发布
-
@brainstorm 仅当您完全忽略 HTTP keep-alive 的存在时。
标签: networking sockets tcp