我正在测试C中的一些代码,我发现TCP套接字调用有奇怪的行为。
我已经定义了一个同步接受客户端的侦听线程,在接受客户端后,它会在for循环中处理它,直到它断开连接。因此,一次只能处理一个客户端。所以我在循环中调用accept
,然后在内循环中调用recv
,直到收到空缓冲区。
我与客户一起开了5个帖子,我打电话给connect
,send
,最后是close
我在任何通话中都没有错误。一切似乎都很好。
然而,当我在服务器端打印收到的消息时,结果发现只有第一个客户端通过服务器,即accept
从未在其他客户端上触发。
所以我的问题是:
connect
等待服务器调用accept
?或者内核层是否负责缓冲?答案 0 :(得分:1)
TCP状态机与客户端的状态机执行 synchronized dance 。所有这些都是在OS级别执行的(TCP / IP 堆栈);用户空间进程只能做一些系统调用来不时地影响这个机器。一旦客户呼叫listen()
这个机器就开始了;并将建立新的联系。
还记得listen(int fd, int backlog)
的第二个参数吗?在accept()
将fd传递到用户空间中的服务器之前,完成了整个3路握手(通过TCP堆栈)。所以:套接字处于连接状态,但用户进程还没有接收它们(通过调用accept()
)
不调用accept()
将导致新连接被内核排队。这些连接功能齐全,但显然数据缓冲区可能会填满,连接也会受到限制。
建议阅读:Comer& Stevens:使用TCP / IP 10.6-10.7进行网络互连(包含TCP状态图)