gpt4 book ai didi

sockets - SO_KEEPALIVE : Detecting connection lost or terminated

转载 作者:行者123 更新时间:2023-12-03 11:53:15 25 4
gpt4 key购买 nike

我有多个线程,每个线程都有一个与客户端应用程序一起打开的套接字。这些线程中的每一个都从主线程接收指令以将命令发送到客户端(命令可以运行测试,停止测试,终止 session ,退出...。)。这些线程是通用的,它们每个客户端只有一个套接字,并且仅在主线程要求时发送命令。

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

我一直在尝试查看如何确定每个客户端的TCP session 已结束。我发现有两个解决方案在这里似乎很合适。

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

我已经尝试过2),因为它听起来实现起来更快,但是我不确定一件事:请问当连接中断时,SO_KEEPALIVE是否会生成SIGPIPE?我看到情况确实如此,但从未收到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);
....

和测试功能:
void test(int n) {
printf("Socket broken: %d\n", n);
}

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

最佳答案

如果保持 Activity 失败,则操作系统将简单地使连接无效,并且该套接字上的任何后续读取/写入操作都将失败,并显示相应的错误代码。您需要确保读/写代码正在处理错误,以便可以关闭套接字(如果尚未关闭)。

关于sockets - SO_KEEPALIVE : Detecting connection lost or terminated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16345013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com