我正在编写一个从 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