Linux中tcp服务器检测客户端断开连接的方法

树莓派TCP服务端心跳维持技巧

现在是在一个树莓派上执行编写好的tcp服务器的程序,一旦有客户端连接上来,服务器就会不断的向客户端发送类似于心跳包的数据。现在的需求是,当客户端软件关闭,服务器不需要从新启动服务器上的tcp进程。

 

涉及到的主要是客户端断开连接后,服务器端继续send时,进程会退出,这是会涉及到信号SIGPIPE的知识,以及使用send中的最后参数或者sigaction的方法,避免进程被杀死。

 

根据上面的使用场景,首先想到的思路就是:1.检测客户端断开连接 -> 2.服务端从新监听客户端的连接 -> 3.更新服务端的发送和接收的socket

 

这里比较重要的就是第一步:检测客户端的连接。

比较简单常规的方法就是,当服务端调用send接口后,如果返回小于0,就直接判断客户端断开连接。这里使用window下的<TCP/UDP socket 调试工具>(如下图1)作为数据收发的客户端。

图1

 

通过这种方法测试得出:如果客户端是直接点击客户端的断开按钮(如下图2),服务器端就直接退出,并且

### Linux C/C++ TCP Server Detect Client Disconnect #### 使用 `select` 和 `SOCKET_ERROR` 为了检测客户端连接是否断开,在Linux下可以利用 `select()` 函数来监视套接字上的可读事件。当客户端正常关闭连接时,服务器会收到一个EOF (End Of File),这可以通过尝试从套接字读取数据并检查返回值为0的情况来识别[^2]。 如果发生异常断开(例如客户端突然崩溃),则可能不会立即得到通知;此时,通过设置套接字选项 SO_KEEPALIVE 可以让内核定期发送探测包给对方,一旦发现无法到达,则认为连接已失效[^1]。 下面是一个简单的例子展示如何实现上述逻辑: ```c #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> /* close */ #include <errno.h> #define BUFFER_SIZE 1024 void handle_client(int connfd){ char buffer[BUFFER_SIZE]; while(1){ ssize_t nread = read(connfd, buffer, sizeof(buffer)-1); if(nread > 0){ // 正常接收到来自client的数据 buffer[nread]='\0'; printf("Received message from client:%s\n",buffer); }else if(nread==0){// 客户端已经优雅地关闭了连接 printf("Client disconnected.\n"); break; }else{ // 发生错误 if(errno != EINTR && errno != EAGAIN){ perror("Read error:"); break; } } sleep(1); // 防止CPU占用过高 } } ``` 对于更复杂的场景,还可以考虑使用更高层次的库如libevent或Boost.Asio等来进行异步IO处理以及更加健壮的心跳机制设计。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值