Sockets 当服务器套接字接受客户端套接字时,到底发生了什么事情?
我正在学习socket编程,服务器socketSockets 当服务器套接字接受客户端套接字时,到底发生了什么事情?,sockets,tcp,Sockets,Tcp,我正在学习socket编程,服务器socketaccept()让我很困惑。我为服务器套接字accept()编写了两个场景,请看一下: 当服务器套接字执行accept()时,它将创建一个新的(客户端)套接字,该套接字绑定到与服务器套接字绑定的端口不同的端口。因此,套接字通信是通过新绑定的端口完成的,服务器套接字(仅适用于accept())正在原始绑定端口上等待另一个客户端连接 我认为这是不完全正确的,因为(1)一个端口与单个进程匹配,(2)套接字接受在进程内部,单个进程可以有多个套接字。因此,根据
accept()
让我很困惑。我为服务器套接字accept()
编写了两个场景,请看一下:
accept()
时,它将创建一个新的(客户端)套接字,该套接字绑定到与服务器套接字绑定的端口不同的端口。因此,套接字通信是通过新绑定的端口完成的,服务器套接字(仅适用于accept()
)正在原始绑定端口上等待另一个客户端连接accept()
时,它将创建一个新的(客户端)套接字,该套接字未绑定到任何特定端口。当客户机与服务器通信时,它使用绑定到服务器套接字的端口(谁accept()
s connections)和实际通信的客户机套接字由传输级别的TCP头(?)的元组解析(sourceIP、sourcePort、destp、destPort)(这也是可疑的,因为我认为套接字在某种程度上是一个应用程序级对象)connect()
和read()或write()
?在没有任何端口绑定的情况下,如何将它们解析到服务器中的每个客户端套接字
如果我的一个场景是正确的,那么这会回答下面的问题吗?或者,我的两个场景都是错误的。如果您能指导我正确的答案,或者至少指导我学习一些相关的文本,我将非常感谢。来自Linux程序员手册,通过
man 2 accept
找到
accept()
系统调用与基于连接的套接字一起使用
类型(SOCK_流、SOCK_SEQPACKET)。它提取第一个连接
请求侦听套接字的挂起连接队列,
sockfd,创建一个新的已连接套接字,并返回一个新文件
引用该套接字的描述符。新创建的套接字不是
处于侦听状态。原始套接字sockfd不受
这个电话
因此,发生的情况是您有一个侦听TCP套接字。有人请求connect()
然后调用accept()
。旧的侦听套接字将保持在侦听模式,而新的套接字将在连接模式下创建。端口是原始侦听端口
这不会干扰侦听套接字,因为新套接字不会侦听传入连接。当您创建一个套接字并在该套接字上进行绑定,然后进行侦听时,您拥有的就是所谓的
侦听套接字。
当建立连接时,这个套接字基本上被克隆到一个新的套接字,这个套接字被称为服务套接字
它绑定到的端口仍然与原始端口相同
但是这个套接字和以前的侦听套接字之间有一个重要的区别,即它是套接字对的一部分。
它是唯一标识连接的套接字对。因此,由于一个套接字对的图片中有2个套接字,TCP通信通道的两端有2个IP地址和2个端口。在克隆服务套接字期间,TCP内核将分配所谓的aTCB
,并在其中存储这2个IP地址@和2个端口。TCB还包含属于TCB的套接字编号
每次TCP段进入时,都会检查TCP头,以及它是否是SYN,对于SYN,您将建立连接,以便已经通过,但内核将检查其侦听套接字列表。如果它是正常的TCP数据包,而不是SYN,则TCP头中都有端口号,IP@是该端口号的一部分e IP头,因此使用此信息内核能够找到属于此TCP连接的TCP。(对于SYN,此信息也存在,但正如我所说的,对于SYN,您必须只处理侦听套接字)
简而言之,这就是它的工作原理
这些信息可以在UNIX网络编程:sockets networking API中找到。其中描述了到sockets的链接,而在其他参考资料中,通常没有太多详细的描述,而是通常强调TCP的本质
当服务器套接字do accept()时,它会创建一个新的(客户端)套接字,该套接字绑定到不同于服务器套接字绑定端口的端口。因此,套接字通信通过新绑定端口完成,而服务器套接字(仅用于accept())正在原始绑定端口上等待另一个客户端连接
没有
我认为这不是很恰当的答案
这是一个错误的答案
因为(1)个端口与单个进程匹配
这并不意味着任何相关的事情
和(2)套接字接受是内部处理事项
事实上,这似乎没有任何意义
单个进程可以有多个套接字
这是真的,但这与您的答案错误的原因没有任何关系。您的答案错误的原因是因为没有使用第二个端口
当服务器套接字do accept()时,它将创建一个新的(客户端)套接字,该套接字不绑定到任何特定端口
否。它创建第二个套接字,该套接字继承服务器套接字的所有内容:端口号、缓冲区大小