【发布时间】:2015-03-29 16:48:54
【问题描述】:
我正在学习套接字编程,而服务器套接字accept() 让我感到困惑。我为服务器套接字accept()写了两个场景,请看:
- 当服务器套接字执行
accept()时,它会创建一个新的(客户端)套接字,该套接字绑定到与服务器套接字绑定的端口不同的端口。所以套接字通信是通过新绑定的端口完成的,服务器套接字(仅限accept())正在原来绑定的端口上等待另一个客户端连接。
我认为这不太正确,因为 (1) 端口与单个进程匹配,并且 (2) 套接字接受是进程内部的问题,并且单个进程可以有多个套接字。所以想到了第二种情况,基于一些stackoverflow的答案:
- 当服务器套接字执行
accept()时,它会创建一个不绑定到任何特定端口的新(客户端)套接字。当客户端与服务器通信时,它使用绑定到服务器套接字的端口(谁accept()s 连接)和哪个客户端套接字实际通信被解析(sourceIP, sourcePort, destIP, destPort)tuple from TCP header(?) at Transmission level(这也很可疑,因为我认为套接字在某种程度上是一个应用程序级对象)
这种情况也引发了一些问题。如果套接字通信仍然使用服务器套接字的端口,即客户端向服务器套接字端口发送一些消息,它不使用服务器套接字的积压队列吗?我的意思是,如何区分来自客户端的消息connect() 和read() or write()?以及如何在没有任何端口绑定的情况下将它们解析到服务器中的每个客户端套接字?
如果我的其中一个场景是正确的,那会回答以下问题吗?或者,我的两种情况都是错误的。如果您能指导我正确答案,或者至少是对一些相关文本进行学习,我将不胜感激。
【问题讨论】:
-
This 是我搜索的问题之一,它对场景2 投了赞成票:
-
不,它没有。没有关于创建未绑定到任何端口的套接字的内容。它不支持您的任何一种方案。
-
accept调用非常简单。如果成功,它会创建一个新套接字,该套接字引用到内核已经接受的其中一个侦听套接字的连接。它只是绑定到那个特定的 TCP 连接。该特定 TCP 连接由源 IP 地址、源端口、目标 IP 地址和目标端口的唯一组合标识。