【发布时间】:2014-07-19 12:52:30
【问题描述】:
我正在编写一个从 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
【问题讨论】:
-
你能在应用层做吗?也就是说,使用你自己的“心跳”消息来知道连接是否断开?
-
您的代码检查了两次。为什么?
-
@JohnZwinck 我不确定如何使用我自己的心跳消息,因为它是一个多线程应用程序并同时连接多个套接字。
-
@EJP 我想知道套接字的默认状态,因此我在启用它之前检查它
标签: c sockets visual-studio-2012 tcp tcpsocket