我有一个TCP连接。服务器只是从客户端读取数据。现在,如果连接丢失,客户端将在将数据写入管道(断开的管道)时出现错误,但服务器仍会侦听该管道。有什么方法可以找到连接是否正常吗?
发布于 2010-11-10 15:14:18
你可以像下面这样调用getsockopt:
int error = 0;
socklen_t len = sizeof (error);
int retval = getsockopt (socket_fd, SOL_SOCKET, SO_ERROR, &error, &len);要测试套接字是否已启动,请执行以下操作:
if (retval != 0) {
/* there was a problem getting the error code */
fprintf(stderr, "error getting socket error code: %s\n", strerror(retval));
return;
}
if (error != 0) {
/* socket has a non zero error status */
fprintf(stderr, "socket error: %s\n", strerror(error));
}发布于 2010-11-10 16:10:16
可靠地检测套接字是否仍在连接的唯一方法是定期尝试发送数据。定义一个客户端忽略的应用层'ping‘数据包通常更方便,但是如果协议已经被指定为没有这样的功能,你应该能够通过设置SO_KEEPALIVE套接字选项来配置tcp套接字来做到这一点。我已经链接到winsock文档,但是所有类似于BSD的套接字堆栈都应该提供相同的功能。
发布于 2010-11-10 16:09:40
TCP保持连接套接字选项(SO_KEEPALIVE)将在这种情况下提供帮助,并在连接丢失的情况下关闭服务器套接字。
https://stackoverflow.com/questions/4142012
复制相似问题