setsockopt( )中如何设置SO_KEEPALIVE的间隔时间,默认是2个小时,如何修改?

suntao222 2003-12-12 11:52:01
加精
如上,现在希望能够时时监测CLIENT的连接状态,但SO_KEEPALIVE的默认间隔时间是2个小时,太长了,但我不知道在哪里修改这个间隔时间,请高手指教,如果能够给出用setsockopt()和getsockopt()来监测的源代码的另外加200分。
...全文
4419 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sevencat 2003-12-15
  • 打赏
  • 举报
回复
bool setnoblock(SOCKET fd)
{
unsigned long param=1;
if(SOCKET_ERROR==ioctlsocket(fd,FIONBIO,¶m))
return false;
return true;
}

bool setlinger(SOCKET fd)
{
LINGER lingerStruct;

lingerStruct.l_onoff = 1;
lingerStruct.l_linger = 0;

if (SOCKET_ERROR == ::setsockopt(fd, SOL_SOCKET, SO_LINGER,
(char *)&lingerStruct, sizeof(lingerStruct)))
return false;
return true;
}

bool setkeepalive(SOCKET fd)
{
int param=1;
if(SOCKET_ERROR==::setsockopt(fd,SOL_SOCKET,SO_KEEPALIVE,(char*)¶m,sizeof(param)))
return false;
return true;
}

bool checksocketerror()
{
int errnum=::WSAGetLastError();
switch(errnum)
{
case WSAEINTR:
return true;
case WSAEINPROGRESS:
return true;
case WSAEWOULDBLOCK:
return true;
case WSAEMSGSIZE:
return true;
case WSAENOBUFS:
return true;
default:
return false;
}
}

bool setrecvbuf(SOCKET fd,int bufsize)
{
int ret=setsockopt(fd,SOL_SOCKET,SO_RCVBUF,(char*)&bufsize,sizeof(bufsize));
if(SOCKET_ERROR==ret)
{
g_Log.log(__FUNCTION__,"Set recvbuf Error :%d",::WSAGetLastError());
return false;
}
return true;
}

bool setsendbuf(SOCKET fd,int bufsize)
{
int ret=setsockopt(fd,SOL_SOCKET,SO_SNDBUF,(char*)&bufsize,sizeof(bufsize));
if(SOCKET_ERROR==ret)
{
g_Log.log(__FUNCTION__,"Set sendbuf Error :%d",::WSAGetLastError());
return false;
}
return true;
}
dingfuhao 2003-12-13
  • 打赏
  • 举报
回复 1
WSAIoctl

SIO_KEEPALIVE_VALS

/* Argument structure for SIO_KEEPALIVE_VALS */
struct tcp_keepalive {
u_long onoff;
u_long keepalivetime;
u_long keepaliveinterval;
};


定義包含在mstcpip.h中
sevencat 2003-12-12
  • 打赏
  • 举报
回复
Windows NT和2000的TCP/IP设置

TCP/IP是一个广泛使用的广域网协议,在NT和2000系统中,它的一些参数会由控制面板中的网络或DHCP服务器提供。下面我们从注册表的角度看看TCP/IP的设置问题。注册表中的大部分设置是最优设置,但是在某些情况下,这些设置可能不能满足某些用户的特殊需要,因此才有必要修改注册表。但是,对注册表的修改是比较危险的,通常情况下,不要对它进行任意的修改。

所有的TCP/IP设置均在两个注册表表项下:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<适配器名>\TCPIP\Parameters

下面的一些值是随控制面板网络中配置一起安装的默认配置:
DatabasePath:数据库路径

Key: Tcpip\Parameters
Value Type: REG_EXPAND_SZ
有效值:一个有效的路径
默认值:%SystemRoot%\system32\drivers\etc
描述:这个值指定了标准internet数据文件(HOSTS, LMHOSTS, NETWORKS, PROTOCOLS)保存的位置,这些文件会为Windows Sockets接口使用
ForwardBroadcasts:转发广播

Key: Tcpip\Parameters
Value Type: REG_DWORD
有效范围: 0或1代表False或True
默认值: 0 (False)
描述:因为不支持转发广播,因此此项被忽略
UseZeroBroadcast:使用零广播

Key: <Adapter Name>\Parameters\Tcpip

注意:在Windows 2000中,这一项的值在Tcpip\Parameters\Interfaces\ID for Adapter

Value Type: REG_DWORD
有效范围: 0或1代表False或True
默认值: 0 (False)
描述:如果此项值为1,则广播地址为全零(0.0.0.0),而通常的广播地址为全一(255.255.255.255),因为有些是由BSD实现演化过来的,因此它们使用全零作为广播地址。

下面的一些参数在注册表的相应表项中可能不存在,用户可以手工加入。

ArpAlwaysSourceRoute:ARP源路由

Key: Tcpip\Parameters
Value Type: REG_DWORD
有效范围: 0或1代表False或True
默认值: 0 (False)
描述:设置此值为真,表示TCP/IP在Token Ring上面以源路由传输ARP查询。通常情况下,ARP解析的第一次请求不会带有源路由,当第一次失败而进行第二次解析时,才加入源路由。
ArpUseEtherSNAP:使用SNAP编码传输

Key: Tcpip\Parameters
Value Type: REG_DWORD
有效范围: 0或1代表False或True
默认值: 0 (False)
描述:设置此值为真表示,TCP会使用802.3 SNAP编码传输数据包。默认情况下是以DIX格式传输数据包。但它可以接收两种类型的数据包。
DefaultTOS:默认的服务类型

Key: Tcpip\Parameters
Value Type: REG_DWORD
有效范围:0 - 255
默认值:0
描述:指定IP包头中的服务类型域,具体的域说明,请参阅IP协议。但是,在Windows2000中此选项无效。
DefaultTTL:默认的TTL

Key: Tcpip\Parameters
Value Type: REG_DWORD
seconds/hops
有效值:1-255
默认值:NT3.51为32,NT4为128
描述:指定包的生存周期,此周期指的是包在网络上能够通过的路由器的数目,当超过这一数目时,包会被抛弃。
EnableDeadGWDetect:执行死网关检测

Key: Tcpip\Parameters
Value Type: REG_DWORD
有效范围: 0或1代表False或True
默认值: 1 (true)
描述:设置此值为1表示TCP可以进行死网关检测,当IP向一个网关发出几个数据包不起作用时,TCP会要求IP向备用网关传输数据包。备用网关在TCP/IP配置中的高级中设置。
EnablePMTUBHDetect:允许检测黑洞路由器

Key: Tcpip\Parameters
Value Type: REG_DWORD
有效范围: 0或1代表False或True
默认值: 0 (False)
描述:设置此值为真表示TCP可以检测黑洞路由器,黑洞路由器就是当需要对包进行分段,而包中不允许分段时不返回ICMP错误消息的路由器。TCP要靠这些返回的ICMP消息要进行最大包长度路径的探测。
EnablePMTUDiscovery:允许进行最大包长度路径检测

Key: Tcpip\Parameters
Value Type: REG_DWORD - Boolean
有效范围: 0或1代表False或True
默认值: 1 (true)
描述:此值为真表示TCP可以进行最大包长度路径检测,检测出的路径可以传输的数据包的大小比其它的路径都要大。这条路径可以减少对IP数据包进行分段,提高传输效率。如果设置此值为假,会使TCP对所有非本地主机传输576字节的数据包。
ForwardBufferMemory:转发缓冲区大小

Key: Tcpip\Parameters
Value Type: REG_DWORD - Number of bytes
有效值:MTU和一个小于0xFFFFFFFF的值之间
默认值:74240
描述:此选项决定路由器使用多少内存用于缓冲路由包。当缓冲区满时,路由器会从缓冲区中随机抛弃包。缓冲区数据大小以256为单位,所以真正使用的内存大小为当前设置的值A*256。对于大包,多个缓冲区会串成链来保存,而所有的包头会另外存储,如果不进行路由转发,此选项会被忽略。
IGMPLevel:决定参与组播和IGMP协议的程度

Key: Tcpip\Parameters
Value Type: REG_DWORD
有效范围:0,1,2
默认值:2
描述:此参数决定系统参与IP组播和IGMP协议的程度。0级时,系统不提供组播支持,1级时,系统可以发出组播包,2级时,系统可以发出组播包并参与IGMP并接收组播包。
KeepAliveInterval:决定分离的keep alive重传之间的间隔

Key: Tcpip\Parameters
Value Type: REG_DWORD
有效值:1 - 0xFFFFFFFF
默认值:1000(1秒)
描述:决定分离的keep alive重传之间的间隔,一旦接收到响应,下一个keep alive重传的时间就再次由KeepAliveTime控制。如果在TcpMaxDataRetransmissions后再得不到响应,就放弃连接。
KeepAliveTime:决定TCP间隔多少时间来确定当前连接还处于连接状态

Key: Tcpip\Parameters
Value Type: REG_DWORD
有效值:1 - 0xFFFFFFFF
默认值: 7,200,000(2小时)
描述:决定TCP间隔多少时间来确定当前连接还处于连接状态。如果远程系统还有响应,由证明此连接处于连接状态。Keep alive数据的发出并不是默认的,它是要受特定的应用程序控制的。
MTU:最大传输单元

Key: <Adapter Name>\Parameters\Tcpip

注意:在Windows 2000下,此选项在Key: Tcpip\Parameters\Interfaces\<ID for Adapter>下

Value Type: REG_DWORD Number
Valid Range: 68
默认值:0xFFFFFFFF
描述:表示能够在下层传输的最大包长度。此长度包括包头,IP数据报可以在多个数据包中包括。
NumForwardPackets:由路由器包队列保存的IP包头个数

Key: Tcpip\Parameters
Value Type: REG_DWORD
有效范围:1到小于0xFFFFFFFF的一个值
默认值:50
描述:由路由器包队列保存的IP包头个数,如果超过此值,路由器会在队列中随机选择进行抛弃。此值应该大于ForwardBufferMemory/最大的IP数据大小,但应该不大于ForwardBufferMemory/256。如果没有启动路由,此选项被忽略。
TcpMaxConnectRetransmissions:最大重新传输请求(SYN)个数

Key: Tcpip\Parameters
Value Type: REG_DWORD
有效范围:0 - 0xFFFFFFFF
默认值:3
描述:此值决定最大重传请求(SYN)个数。重传超时值会在接收到一个成功重传后乘2,初始超时值为3秒。
TcpMaxDataRetransmissions:TCP重传单个数据段的次数

Key: Tcpip\Parameters
Value Type: REG_DWORD
有效值:0 - 0xFFFFFFFF
默认值:5
描述:此参数控制TCP重传单个数据段的次数。
TcpNumConnections:同时打开的连接数

Key: Tcpip\Parameters
Value Type: REG_DWORD - Number
有效值:0 - 0xfffffe
默认值:0xfffffe
描述:限制TCP同时打开的连接数。
TcpTimedWaitDelay:停止在TIME_WAIT状态的最长时间

Key: Tcpip\Parameters
Value Type: REG_DWORD
有效值:30-300
默认值:0xF0(240秒)
描述:限制停止在TIME_WAIT状态的最长时间。当处于TIME_WAIT时,套接字无法被再利用,这种状态也被称为"2MSL"状态。
TcpUseRFC1122UrgentPointer:解释紧急指针的状态

Key: Tcpip\Parameters
Value Type: REG_DWORD
有效范围: 0或1代表False或True
默认值: 0 (False)
描述:此参数由于决定TCP传输紧急数据时是使用RFC 1122标准还是使用BSD系统标准。这两种标准是不兼容的,通常情况下,Windows NT使用BSD模式。
TcpWindowSize:决定接收窗口的最大长度

Key: Tcpip\Parameters
Value Type: REG_DWORD
有效范围:0 - 0xFFFF
默认值:小于0xFFFF的值,对于以太网为8760
描述:决定TCP接收窗口的大小。接收窗口指定的TCP能够缓冲多少个未经确认的数据包。通常大一点的接收窗口能够提高系统效率。为了高效,此值通常为TCP最大传输单元大小的偶数倍。
sevencat 2003-12-12
  • 打赏
  • 举报
回复
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Tcpip\Parameters]
假如是98下面的,就是Vxd子目录下面的。
starcbh 2003-12-12
  • 打赏
  • 举报
回复
好象是平台相关,不能改的
suntao222 2003-12-12
  • 打赏
  • 举报
回复
能不能写一个例子代码出来啊,讲解一下setsockopt()里面参数的具体设置方法,还有如何使用getsockopt()去读它的连接状态
sevencat 2003-12-12
  • 打赏
  • 举报
回复
翻译得太差,
实际上是用setsockopt来关闭或者打开这个功能。
suntao222 2003-12-12
  • 打赏
  • 举报
回复
Key: Tcpip\Parameters
Value Type: REG_DWORD
有效值:1 - 0xFFFFFFFF
默认值: 7,200,000(2小时)
描述:决定TCP间隔多少时间来确定当前连接还处于连接状态。如果远程系统还有响应,由证明此连接处于连接状态。Keep alive数据的发出并不是默认的,它是要受特定的应用程序控制的。
MTU:最大传输单元

注册表里的名称应该是什么?还有“Keep alive数据的发出并不是默认的,它是要受特定的应用程序控制的”这句话什么意思?是我可以用程序控制吗?怎么控制?

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧