Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 当服务器套接字接受客户端套接字时,到底发生了什么事情?_Sockets_Tcp - Fatal编程技术网

Sockets 当服务器套接字接受客户端套接字时,到底发生了什么事情?

Sockets 当服务器套接字接受客户端套接字时,到底发生了什么事情?,sockets,tcp,Sockets,Tcp,我正在学习socket编程,服务器socketaccept()让我很困惑。我为服务器套接字accept()编写了两个场景,请看一下: 当服务器套接字执行accept()时,它将创建一个新的(客户端)套接字,该套接字绑定到与服务器套接字绑定的端口不同的端口。因此,套接字通信是通过新绑定的端口完成的,服务器套接字(仅适用于accept())正在原始绑定端口上等待另一个客户端连接 我认为这是不完全正确的,因为(1)一个端口与单个进程匹配,(2)套接字接受在进程内部,单个进程可以有多个套接字。因此,根据

我正在学习socket编程,服务器socket
accept()
让我很困惑。我为服务器套接字
accept()
编写了两个场景,请看一下:

  • 当服务器套接字执行
    accept()
    时,它将创建一个新的(客户端)套接字,该套接字绑定到与服务器套接字绑定的端口不同的端口。因此,套接字通信是通过新绑定的端口完成的,服务器套接字(仅适用于
    accept()
    )正在原始绑定端口上等待另一个客户端连接
  • 我认为这是不完全正确的,因为(1)一个端口与单个进程匹配,(2)套接字接受在进程内部,单个进程可以有多个套接字。因此,根据stackoverflow的一些答案,考虑第二种情况:

  • 当服务器套接字执行
    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内核将分配所谓的a
    TCB
    ,并在其中存储这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()时,它将创建一个新的(客户端)套接字,该套接字不绑定到任何特定端口

    否。它创建第二个套接字,该套接字继承服务器套接字的所有内容:端口号、缓冲区大小