全局修改
在不同的操作系統(tǒng)上,修改TCP/IP參數(shù)的方法略有不同,現(xiàn)在對Windows 2000/NT、RISC6000/AIX、HP-UNIX、SUN Solaris以及SCO OpenServer平臺下的修改方法逐一進(jìn)行說明:
1)在Windows NT平臺上, 我們利用regedit來修改系統(tǒng)注冊表,修改HKEY_LOCAL_MACHINE\CurrentControlSet\Services\Tcpip\Parameters下的以下三個參數(shù):
KeepAliveInterval,設(shè)置其值為1000
KeepAliveTime,設(shè)置其值為300000(單位為毫秒,300000代表5分鐘)
TcpMaxDataRetransmissions,設(shè)置其值為5

2)在RISC6000/AIX平臺上, 用no命令修改如下參數(shù):
tcp_keepidle保持TCP/IP連接的時間,單位為0.5秒,缺省值為14,400,即兩個小時,我們可將它設(shè)為5分鐘;
tcp_keepinittcp連接初始timeout值,單位為0.5秒,缺省值為150,我們可將它設(shè)為50;
tcp_keepintvl連接間隔,單位為0.5秒,缺省值為150,我們可將它設(shè)為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
注意:直接使用命令行修改,在機(jī)器重啟后,會失效;修改rc.net文件,可以做到永久生效。

3)在HP平臺上,
對于HP-UNIX V10.20及其在此之前的版本,用/usr/contrib/bin nettune命令來修改有關(guān)參數(shù);
對于HP-UNIX V10.30及其以上版本,用/usr/bin/ndd命令來修改有關(guān)參數(shù)。

4)在SUN Solaris平臺上,
用ndd -set /dev/tcptcp_keepalive_interval NNN命令來修改有關(guān)參數(shù),tcp_keepalive_interval的單位為毫秒,缺省值為7200000毫秒,即2個小時。

5)在SCO OpenServer平臺上,
tcp_keepalive 和 tcp_keepidle 相同,其原先默認(rèn)值為 7200 秒,可設(shè)為 600秒。tcp_keepintvl 其原先默認(rèn)值為 75 秒,可設(shè)為15秒。均以"秒"為單位。
運(yùn)行命令 ifconfig 命令修改:
/etc/inconfig tcp_keepidle
/etc/inconfig tcp_keepintvl

  通常,操作系統(tǒng)的TCP/IP參數(shù)的缺省設(shè)置是2個小時(常見的操作系統(tǒng)平臺如:Windows 2000/NT以及AIX,HP-UX,Sun Solaris,Linux等,缺省設(shè)定均為2個小時),即發(fā)送KeepAlive探測包的時間是2小時,所以需要2個小時的時間它才會獲知網(wǎng)絡(luò)連接已經(jīng)斷開,因此當(dāng)有需要的時候我們可以通過配置TCP/IP KeepAlive參數(shù)來提高TCP/IP的響應(yīng)速度。

局部修改
#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連接多長時間(毫秒)沒有數(shù)據(jù)就開始發(fā)送心跳包,有數(shù)據(jù)傳遞的時候不發(fā)送心跳包。
 //系統(tǒng)默認(rèn)2小時,我設(shè)置15分鐘,不宜設(shè)置過小
 alive_in.keepaliveinterval  = 1000; //當(dāng)keepalivetime時間到達(dá)后,每隔多長時間(毫秒)發(fā)送一個心跳包,發(fā)5次(系統(tǒng)默認(rèn)值)
 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;
}