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

时间:2017-04-10 16:49:55

标签: c sockets tcp

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

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

  2. 我与客户一起开了5个帖子,我打电话给connectsend,最后是close

  3. 我在任何通话中都没有错误。一切似乎都很好。

  4. 然而,当我在服务器端打印收到的消息时,结果发现只有第一个客户端通过服务器,即accept从未在其他客户端上触发。

    所以我的问题是:

    1. 不应connect等待服务器调用accept?或者内核层是否负责缓冲?
    2. 如果不是这样的话,服务器是否应该能够接受套接字,即使它处于断开状态?我的意思是它会丢失所有传入的数据吗?
    3. 或者我应该假设我的代码中存在错误?

1 个答案:

答案 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状态图)