当前位置: 首页 > 知识库问答 >
问题:

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

阎安邦
2023-03-14

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

>

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

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

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

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

    所以我的问题是:

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

  • 共有1个答案

    太叔凌龙
    2023-03-14

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

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

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

    建议阅读:Comer

     类似资料:
    • 我正在使用C#window应用程序表单对TCP多线程服务器进行工作,我正在尝试检测客户端的机器是否关闭并断开与服务器的连接。看了一些帖子,有了一些想法: 如何确定tcp是否连接? 我的代码如下: 多谢帮忙。

    • 我正在编写一个使用tcp套接字的服务器/客户端应用程序,我的问题是如何检测半开放连接,我计划使用keep-alive但有些人建议我做我自己的协议,所以我现在的计划是: 在服务器端: 服务器会等待10秒等待客户端发送数据,如果在给定的时间内服务器没有收到客户端的消息,服务器会将客户端标记为断开连接,否则,如果服务器收到客户端的消息,则会重新设置计时器。 我现在的问题是,这样行吗?还是我做错了?还是一

    • 我想检查一下我的客户是否断开了连接。根据我的研究,一种可能的方式是我可以继续给客户写信。如果客户端未能接收到消息,则表示已断开连接。我向相应的客户端发送消息“Checking Connection:Client”clientNo。 我将clientNo 1连接到服务器,它接收 客户1 但是当我将另一个客户端连接到服务器时,我的clientNo1停止接收来自服务器的消息,我的clientNo2现在将

    • 我将Firebase后端用于我的android应用程序。我想为我的聊天建立一个用户状态系统。为此,我采用了Firebase指南中的模式 麻烦的是我不知道什么时候会触发断开连接事件?! 每次我打开应用程序时,我都会将TRUE写入节点“用户/joe/连接”,但是当我关闭应用程序时,不会发生任何事情。当我关闭WIFI时,布尔参数也不会被删除。onDisconnect 事件仅在我强制停止应用程序或重新安装

    • 我使用这个(Android TCP连接增强的)教程来创建简单的JAVA TCPServer和Android TCPClient。它工作得很好,但使用这段代码我只能同时将一个设备连接到服务器。我必须更改什么才能连接多个设备?