全局修改
在不同的操作系统上,修改TCP/IP参数的方法略有不同,现在对Windows 2000/NT、RISC6000/AIX、HP-UNIX、SUN Solaris以及SCO OpenServer平台下的修改方法逐一进行说明:
1)在Windows NT平台上, 我们利用regedit来修改系统注册表,修改HKEY_LOCAL_MACHINE\CurrentControlSet\Services\Tcpip\Parameters下的以下三个参数:
KeepAliveInterval,设置其值为1000
KeepAliveTime,设置其值为300000(单位为毫秒,300000代表5分钟)
TcpMaxDataRetransmissions,设置其值为5

2)在RISC6000/AIX平台上, 用no命令修改如下参数:
tcp_keepidle保持TCP/IP连接的时间,单位为0.5秒,缺省值为14,400,即两个小时,我们可将它设为5分钟;
tcp_keepinittcp连接初始timeout值,单位为0.5秒,缺省值为150,我们可将它设为50;
tcp_keepintvl连接间隔,单位为0.5秒,缺省值为150,我们可将它设为50;
我们也可以修改/etc/rc.net文件,
/usr/sbin/no -o tcp_keepidle=240
/usr/sbin/no -o tcp_keepinit=50
/usr/sbin/no -o tcp_keepintvl=50
注意:直接使用命令行修改,在机器重启后,会失效;修改rc.net文件,可以做到永久生效。

3)在HP平台上,
对于HP-UNIX V10.20及其在此之前的版本,用/usr/contrib/bin nettune命令来修改有关参数;
对于HP-UNIX V10.30及其以上版本,用/usr/bin/ndd命令来修改有关参数。

4)在SUN Solaris平台上,
用ndd -set /dev/tcptcp_keepalive_interval NNN命令来修改有关参数,tcp_keepalive_interval的单位为毫秒,缺省值为7200000毫秒,即2个小时。

5)在SCO OpenServer平台上,
tcp_keepalive 和 tcp_keepidle 相同,其原先默认值为 7200 秒,可设为 600秒。tcp_keepintvl 其原先默认值为 75 秒,可设为15秒。均以"秒"为单位。
运行命令 ifconfig 命令修改:
/etc/inconfig tcp_keepidle
/etc/inconfig tcp_keepintvl

  通常,操作系统的TCP/IP参数的缺省设置是2个小时(常见的操作系统平台如:Windows 2000/NT以及AIX,HP-UX,Sun Solaris,Linux等,缺省设定均为2个小时),即发送KeepAlive探测包的时间是2小时,所以需要2个小时的时间它才会获知网络连接已经断开,因此当有需要的时候我们可以通过配置TCP/IP KeepAlive参数来提高TCP/IP的响应速度。

局部修改
#include <mstcpip.h>
BOOL SetSocketKeepAlive(SOCKET sock)
{
 BOOL bKeepAlive = TRUE; 
 int nRet = setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE,  
  (char*)&bKeepAlive, sizeof(bKeepAlive)); 
 if (nRet == SOCKET_ERROR) 
 { 
  TRACE("setsockopt failed: %d/n", WSAGetLastError()); 
  return FALSE; 
 } 
 // set KeepAlive parameter 
 
 tcp_keepalive alive_in; 
 tcp_keepalive alive_out; 
 alive_in.keepalivetime  = 900 * 1000; // TCP连接多长时间(毫秒)没有数据就开始发送心跳包,有数据传递的时候不发送心跳包。
 //系统默认2小时,我设置15分钟,不宜设置过小
 alive_in.keepaliveinterval  = 1000; //当keepalivetime时间到达后,每隔多长时间(毫秒)发送一个心跳包,发5次(系统默认值)
 alive_in.onoff              = TRUE; 
 unsigned long ulBytesReturn = 0; 
 
 nRet = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &alive_in, sizeof(alive_in), 
  &alive_out, sizeof(alive_out), &ulBytesReturn, NULL, NULL); 
 if (nRet == SOCKET_ERROR) 
 { 
  TRACE("WSAIoctl failed: %d/n", WSAGetLastError()); 
  return FALSE; 
 } 
 return TRUE;
}