gpt4 book ai didi

c - 在 C 中使用 TCP_KEEPALIVE 识别 tcp 套接字上的网络关闭

转载 作者:可可西里 更新时间:2023-11-01 02:54:30 26 4
gpt4 key购买 nike

我正在编写一个从 tcp 服务器接收数据的 tcp 客户端程序。当网络出现问题(即网络中断)时,我无法关闭连接。

我已经使用 SO_KEEPALIVE 来允许应用程序为套接字连接启用保活数据包。 SO_KEEPALIVE 属性成功开启,但我无法修改 KeepAliveTime 的默认值(即 2 小时)

编辑 KeepAliveTime 的另一个可用选项是编辑注册表值,但我无法在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 位置找到注册表项

以下代码检查并启用 SO_KEEPALIVE。

char optval;
char optout;
int optlen;
int optlen2;
optlen = sizeof(optval);
optlen2 = sizeof(optout);
got = getsockopt(loFds[i], SOL_SOCKET, SO_KEEPALIVE, &optval, &optlen );
if(got < 0)
{
printf("getsockopt unsuccessful. Error %ld\n", WSAGetLastError());
}
else if (got == 0) {
//printf("SO_KEEPALIVE is %s\n", (optval ? "ON" : "OFF"));
printf("SO_KEEPALIVE is %ld\n", optval);
}


optval = 1;
//optout = 1;
got = (setsockopt(loFds[i], SOL_SOCKET, SO_KEEPALIVE, &optval, optlen));
if( got < 0)
{
printf("setsockopt unsuccessful on socket\n");
}
else if (got == 0) {
printf("SO_KEEPALIVE set on socket\n");
}



got = (getsockopt(loFds[i], SOL_SOCKET, SO_KEEPALIVE, &optout, &optlen2 ));
if( got < 0)
{

printf("getsockopt unsuccessful. Error %ld\n", WSAGetLastError());

}
else if (got == 0) {
printf("SO_KEEPALIVE is %ld\n", optval);
}

但我要求它在用户定义的时间(可能是 5 分钟左右)后断开套接字。请提出任何其他解决方案。

平台:Windows 7 Professional 上的 Visual C 2012

最佳答案

在 Windows 2000 及更高版本上,您可以使用 WSAIoctl(SIO_KEEPALIVE_VALS)而不是 setsockopt(SO_KEEPALIVE) 以在每个套接字的基础上设置自定义保持事件超时/间隔值。

您还可以使用 select() , WSAAsyncSelect() , 或 WSAEventSelect()在读取数据之前检测数据何时可供读取。如果在数据到达之前发生超时,只需关闭套接字。

关于c - 在 C 中使用 TCP_KEEPALIVE 识别 tcp 套接字上的网络关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24840602/

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