检测死套接字
C++ - detecting dead sockets
我有一个用c++编写的服务器应用程序。当客户端连接时,它为他创建一个新线程。在该线程中,从套接字读取阻塞。因为客户端有可能意外断开连接并留下一个仍然挂在read函数上的线程,所以有一个线程通过发送"心跳消息"来检查套接字是否仍然存活。该消息由1个字符组成,并被客户端"忽略"(不像处理其他消息那样处理它)。写入内容如下所示:
write(fd, ";", 1);
它工作得很好,但是真的有必要通过套接字发送一个随机字符吗?我试图发送一个空消息(长度为0的"),但它不起作用。有没有更好的方法来解决这个套接字检查?
编辑:我正在使用BSD套接字(TCP)
我想你说的"socket "是指TCP网络套接字。
如果这是真的,那么TCP协议会给你一个keepalive选项,你需要请求操作系统使用。
我认为这个StackOverflow答案得到了你需要做的事情,假设有一个BSDish套接字库。
根据我的经验,在TCP上使用心跳消息(并检查响应,例如NOP/NOP- ack)是在应用层获得可靠和及时的连接指示的最简单方法。网络层可以做一些有趣的事情,但在应用程序中获取通知可能会很棘手。
如果你可以切换到UDP,你将在应用层有更多的控制和灵活性,并且可能减少总体流量,因为你可以自定义通信,但你需要自己处理可靠性,数据包排序等。
可以设置连接KEEPALIVE。你可能对这个链接感兴趣:http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html
它是ok的,你创建一个线程为每个新的到来的请求,如果它只是玩具。在大多数情况下,我使用poll,即非阻塞io,以提高性能。
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 套接字读取后,我在缓冲区中看到意外输入
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- 如何在 boost asio 中检测套接字上的关闭连接,而无需阻塞调用
- 如何检测我是否有要从套接字读取的内容?(c++)
- 阻塞套接字 - 检测状态
- TCP套接字:在发送之前检测对等方是否已关闭?(Linux)
- 如何检测提升 TCP 套接字何时断开连接
- 如果客户端的互联网断开连接,客户端套接字不会关闭。如何在服务器中检测此事件?
- 检测死套接字
- UDP套接字缓冲区溢出检测
- Java Tcp套接字:如何在客户端检测服务器不再需要接收数据
- c++检测客户端是否关闭了连接(多套接字)
- 无法检测到C++同步提升::asio::ip::tcp::套接字连接正在关闭
- 从一组套接字中检测超时套接字