Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets SO_KEEPALIVE:检测连接丢失或终止_Sockets_Keep Alive - Fatal编程技术网

Sockets SO_KEEPALIVE:检测连接丢失或终止

Sockets SO_KEEPALIVE:检测连接丢失或终止,sockets,keep-alive,Sockets,Keep Alive,我有多个线程,每个线程都有一个与客户端应用程序打开的套接字。这些线程中的每一个都从主线程接收一条指令,以向客户端发送命令(命令可以是运行测试、停止测试、终止会话、退出……)。这些线程是泛型的,它们只是每个客户端有一个套接字,并且在主线程请求时发送一个命令 客户端可能退出或崩溃,或者网络可能损坏 我一直在尝试了解如何确定每个客户端的TCP会话都已结束。我发现两个解决方案在这里似乎是合适的 1) 实现我自己的心跳系统 2) 使用setsockopt使用keepAlive 我尝试过2)因为它听起来实现

我有多个线程,每个线程都有一个与客户端应用程序打开的套接字。这些线程中的每一个都从主线程接收一条指令,以向客户端发送命令(命令可以是运行测试、停止测试、终止会话、退出……)。这些线程是泛型的,它们只是每个客户端有一个套接字,并且在主线程请求时发送一个命令

客户端可能退出或崩溃,或者网络可能损坏

我一直在尝试了解如何确定每个客户端的TCP会话都已结束。我发现两个解决方案在这里似乎是合适的

1) 实现我自己的心跳系统 2) 使用setsockopt使用keepAlive

我尝试过2)因为它听起来实现起来更快,但我不确定一件事:当连接中断时,Sou_KEEPALIVE会生成一个SIGPIPE吗?我知道应该是这样,但从未收到过信号管

这就是我的代码的外观:

void setKeepAlive(int sockfd) {
    int optval;

    optval = 1;
    setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval));
    optval = 1;
    setsockopt(sockfd, SOL_TCP, TCP_KEEPIDLE, &optval, sizeof(optval));
    optval = 1;
    setsockopt(sockfd, SOL_TCP, TCP_KEEPCNT, &optval, sizeof(optval));
    optval = 1;
    setsockopt(sockfd, SOL_TCP, TCP_KEEPINTVL, &optval, sizeof(optval));
}
我接受连接的代码如下:

for (mNumberConnectedClients = 0; mNumberConnectedClients < maxConnections; ++mNumberConnectedClients) {
    clientSocket = accept(sockfd, (struct sockaddr *) &client_addr, &clientLength);

    // set KeepAlive on socket
    setKeepAlive(clientSocket);

    pthread_create(&mThread_pool[mNumberConnectedClients], NULL, controlClient, (void*) &clientSocket);
}

signal(SIGPIPE, test);
....

test()永远不会被触发。请问是我的理解错了吗?我不确定是否生成了SIGPIPE。非常感谢。

如果保持活动失败,操作系统将使连接失效,并且该套接字上的任何后续读/写操作都将失败并产生相应的错误代码。您需要确保您的读/写代码正在处理错误,以便它可以关闭套接字(如果尚未关闭)。

好的,谢谢,因此我不能依靠中断让我知道,我只需要每隔一段时间编写一次。那我就用我自己的心跳。谢谢
void test(int n) {
    printf("Socket broken: %d\n", n);
}