当前位置:  开发笔记 > 运维 > 正文

socket API accept()函数如何工作?

如何解决《socketAPIaccept()函数如何工作?》经验,为你挑选了3个好方法。

套接字API是TCP/IP和UDP/IP通信的事实标准(即我们所知的网络代码).然而,它的核心功能之一,accept()有点神奇.

借用半正式定义:

在服务器端使用accept().它接受从远程客户端创建新TCP连接的接收传入尝试,并创建与此连接的套接字地址对关联的新套接字.

换句话说,accept返回一个新的套接字,服务器可以通过该套接字与新连接的客户端进行通信.旧套接字(在其accept上调用)保持打开状态,在同一端口上侦听新连接.

accept工作怎么样?它是如何实现的?这个话题有很多混乱.许多人声称接受打开一个新端口,并通过它与客户沟通.但这显然不是真的,因为没有新的端口被打开.你实际上可以通过同一个端口与不同的客户端进行通信,但是如何?当多个线程调用recv同一个端口时,数据如何知道去哪里?

我想这是客户端地址与套接字描述符相关联的内容,每当数据通过时recv它被路由到正确的套接字,但我不确定.

对这种机制的内部运作进行彻底的解释是很好的.



1> 17 of 26..:

您的困惑在于认为服务器IP:服务器端口标识了套接字.实际上,套接字由四个信息唯一标识:

Client IP : Client PortServer IP : Server Port

因此,虽然服务器IP和服务器端口在所有已接受的连接中都是常量,但客户端信息可以让它跟踪所有事情的进展.

澄清事情的例子:

假设我们有一个服务器192.168.1.1:80和两个客户端,10.0.0.1并且10.0.0.2.

10.0.0.1在本地端口上打开连接1234并连接到服务器.现在服务器有一个标识如下的套接字:

10.0.0.1:1234 - 192.168.1.1:80  

现在10.0.0.2打开本地端口上的连接5678并连接到服务器.现在服务器有两个套接字,标识如下:

10.0.0.1:1234 - 192.168.1.1:80  
10.0.0.2:5678 - 192.168.1.1:80


路由器中的NAT支持负责那里的细节.网络流量实际上是通过两个连接 - 客户端到路由器,路由器到服务器.路由器在两个不同的端口192.168.0.1:1234和192.168.0.1:5678上建立传出连接.然后,路由器将传入流量重定向到正确的客户端.
我不知道实现细节(可能因平台而异),我只知道概念上套接字由我描述的四重信息识别.
您对此有参考吗?
随机问题:如果使用NAT会发生什么情况,并且同一网络上的两个客户端在连接到服务器时会尝试使用相同的本地端口?例如,如果10.0.0.1和10.0.0.2都连接到外部IP为192.168.0.1的路由器,则192.168.1.1的服务器会看到192.168.0.1的两个连接.在这种情况下会发生什么情况,如果由随机数发生器的某些侥幸10.0.0.1和10.0.0.2选择相同的本地端口?
如果套接字由四方标识,那么侦听套接字的四方信息是什么?

2> Methos..:

只是为了添加用户给出的答案"17 of 26"

套接字实际上由5个元组组成 - (源IP,源端口,目标IP,目标端口,协议).这里协议可以是TCP或UDP或任何传输层协议.该协议在来自IP数据报中"协议"字段的数据包中标识.

因此,服务器上的不同应用程序可能必须在完全相同的4元组上与同一客户机通信,但协议字段不同.例如

服务器端的Apache谈论(TCP上的server1.com:880-client1:1234)和魔兽世界谈论(UDP上的server1.com:880-client1:1234)

客户端和服务器都将处理此问题,因为即使所有其他4个字段相同,在两种情况下IP数据包中的协议字段也是不同的.



3> a2800276..:

当我学习这个时,让我困惑的是,这些术语socketport暗示它们是物理的东西,而事实上它们只是内核用来抽象网络细节的数据结构.

因此,实现数据结构以能够保持与不同客户端的连接.至于它们是如何实现的,答案是a.)无关紧要,套接字API的目的正是实现无关紧要或b.)只是看一看.除了强烈推荐的Stevens书籍提供了一个实现的详细描述之外,请查看Linux或Solaris中的源代码或其中一个BSD.

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有