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
TCP:当客户端在接受之前连接、发送数据和断开连接时会发生什么_C_Sockets_Tcp - Fatal编程技术网

TCP:当客户端在接受之前连接、发送数据和断开连接时会发生什么

TCP:当客户端在接受之前连接、发送数据和断开连接时会发生什么,c,sockets,tcp,C,Sockets,Tcp,我正在用C测试一些代码,我发现TCP套接字调用有奇怪的行为 我已经定义了一个同步接受客户机的侦听线程,在接受客户机之后,它将在for循环中处理它,直到断开连接。因此,一次只处理一个客户机。所以我在一个循环中调用accept,然后在一个内部循环中调用recv,直到收到一个空缓冲区 我与客户端启动5个线程,我调用连接,发送,最后调用关闭 我在任何电话中都没有出错。一切似乎都很好 但是,当我在服务器端打印接收到的消息时,结果表明只有第一个客户机通过服务器,即,accept从不在其他客户机上触发 因此,

我正在用C测试一些代码,我发现TCP套接字调用有奇怪的行为

  • 我已经定义了一个同步接受客户机的侦听线程,在接受客户机之后,它将在for循环中处理它,直到断开连接。因此,一次只处理一个客户机。所以我在一个循环中调用
    accept
    ,然后在一个内部循环中调用
    recv
    ,直到收到一个空缓冲区

  • 我与客户端启动5个线程,我调用
    连接
    发送
    ,最后调用
    关闭

  • 我在任何电话中都没有出错。一切似乎都很好

  • 但是,当我在服务器端打印接收到的消息时,结果表明只有第一个客户机通过服务器,即,
    accept
    从不在其他客户机上触发

    因此,我的问题是:

  • 是否应该
    连接
    等待服务器调用
    接受
    ?还是内核层负责引擎盖下的缓冲
  • 如果不是这样,那么即使套接字处于断开连接状态,服务器也不应该接受套接字吗?我的意思是它会丢失所有传入的数据吗
  • 或者我应该假设我的代码中有一个bug吗

  • TCP状态机与客户端的状态机执行同步舞蹈。所有这些都是在操作系统级别(TCP/IP堆栈)上执行的;用户空间进程只能偶尔进行一些系统调用来影响这台机器。一旦客户端调用
    listen()
    这个机器就会启动;将建立新的连接


    还记得
    listen(intfd,intbacklog)的第二个参数吗?在
    accept()
    将fd发送到userland中的服务器之前,整个3路握手(通过TCP堆栈)完成。因此:套接字处于已连接状态,但用户进程尚未拾取它们(通过调用
    accept()

    不调用
    accept()
    将导致内核将新连接排入队列。这些连接功能齐全,但很明显,数据缓冲区可能会被填满,连接可能会受到限制


    建议阅读:Comer&Stevens:与TCP/IP 10.6-10.7(包含TCP状态图)的互联互通

    还记得
    侦听(int-fd,int-backlog)的第二个参数吗?在
    accept()
    将fd发送到userland中的服务器之前,整个3路握手(通过TCP堆栈)完成。因此:套接字处于已连接状态,但用户进程尚未拾取它们(通过调用
    accept()
    )@joop-Right。我现在明白了。所以数据被缓冲了。我没有看到输出的原因是我意外地锁定了服务器。谢谢你回答我的第一个问题。我已经知道答案2了。@joop你可以把它写下来作为答案,这样我就可以接受了。