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