﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Robertxiao-文章分类-network</title><link>http://www.cppblog.com/Robertxiao/category/17563.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 16 Aug 2011 05:23:30 GMT</lastBuildDate><pubDate>Tue, 16 Aug 2011 05:23:30 GMT</pubDate><ttl>60</ttl><item><title>修改tcp 的keep alive时间</title><link>http://www.cppblog.com/Robertxiao/articles/153510.html</link><dc:creator>Robertxiao</dc:creator><author>Robertxiao</author><pubDate>Tue, 16 Aug 2011 02:00:00 GMT</pubDate><guid>http://www.cppblog.com/Robertxiao/articles/153510.html</guid><wfw:comment>http://www.cppblog.com/Robertxiao/comments/153510.html</wfw:comment><comments>http://www.cppblog.com/Robertxiao/articles/153510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Robertxiao/comments/commentRss/153510.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Robertxiao/services/trackbacks/153510.html</trackback:ping><description><![CDATA[<div class="postcontent"><strong style="color: #0000ff">全局修改</strong><strong><br /></strong>在不同的操作系统上，修改TCP/IP参数的方法略有不同，现在对Windows 2000/NT、RISC6000/AIX、HP-UNIX、SUN Solaris以及SCO OpenServer平台下的修改方法逐一进行说明：<br />1）在Windows NT平台上， 我们利用regedit来修改系统注册表，修改HKEY_LOCAL_MACHINE\CurrentControlSet\Services\Tcpip\Parameters下的以下三个参数： <br />KeepAliveInterval,设置其值为1000 <br />KeepAliveTime,设置其值为300000(单位为毫秒，300000代表5分钟) <br />TcpMaxDataRetransmissions,设置其值为5 <br /><br />2）在RISC6000/AIX平台上， 用no命令修改如下参数: <br />tcp_keepidle保持TCP/IP连接的时间，单位为0.5秒，缺省值为14,400，即两个小时，我们可将它设为5分钟； <br />tcp_keepinittcp连接初始timeout值，单位为0.5秒，缺省值为150，我们可将它设为50； <br />tcp_keepintvl连接间隔，单位为0.5秒，缺省值为150，我们可将它设为50； <br />我们也可以修改/etc/rc.net文件， <br />/usr/sbin/no -o tcp_keepidle=240 <br />/usr/sbin/no -o tcp_keepinit=50 <br />/usr/sbin/no -o tcp_keepintvl=50 <br />注意：直接使用命令行修改，在机器重启后，会失效；修改rc.net文件，可以做到永久生效。 <br /><br />3）在HP平台上， <br />对于HP-UNIX V10.20及其在此之前的版本，用/usr/contrib/bin nettune命令来修改有关参数； <br />对于HP-UNIX V10.30及其以上版本，用/usr/bin/ndd命令来修改有关参数。 <br /><br />4）在SUN Solaris平台上， <br />用ndd -set /dev/tcptcp_keepalive_interval NNN命令来修改有关参数,tcp_keepalive_interval的单位为毫秒，缺省值为7200000毫秒，即2个小时。 <br /><br />5）在SCO OpenServer平台上， <br />tcp_keepalive 和 tcp_keepidle 相同，其原先默认值为 7200 秒，可设为 600秒。tcp_keepintvl 其原先默认值为 75 秒，可设为15秒。均以"秒"为单位。 <br />运行命令 ifconfig 命令修改： <br />/etc/inconfig tcp_keepidle <value><br />/etc/inconfig tcp_keepintvl <value><br /><br />　　通常，操作系统的TCP/IP参数的缺省设置是2个小时（常见的操作系统平台如：Windows 2000/NT以及AIX，HP-UX，Sun Solaris，Linux等，缺省设定均为2个小时），即发送KeepAlive探测包的时间是2小时，所以需要2个小时的时间它才会获知网络连接已经断开，因此当有需要的时候我们可以通过配置TCP/IP KeepAlive参数来提高TCP/IP的响应速度。<br /><br /><span style="color: #0000ff"><strong>局部修改<br /></strong></span><span style="color: #000000">#include &lt;mstcpip.h&gt;<br /></span><span style="color: #000000">BOOL SetSocketKeepAlive(SOCKET sock)<br /></span><span style="color: #000000">{<br /></span><span style="color: #000000">&nbsp;BOOL bKeepAlive = TRUE;&nbsp; <br /></span><span style="color: #000000">&nbsp;int nRet = setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE,&nbsp;&nbsp; <br /></span><span style="color: #000000">&nbsp;&nbsp;(char*)&amp;bKeepAlive, sizeof(bKeepAlive));&nbsp; <br /></span><span style="color: #000000">&nbsp;if (nRet == SOCKET_ERROR)&nbsp; <br /></span><span style="color: #000000">&nbsp;{&nbsp; <br /></span><span style="color: #000000">&nbsp;&nbsp;TRACE("setsockopt failed: %d/n", WSAGetLastError());&nbsp; <br /></span><span style="color: #000000">&nbsp;&nbsp;return FALSE;&nbsp; <br /></span><span style="color: #000000">&nbsp;}&nbsp; <br /></span><span style="color: #000000">&nbsp;// set KeepAlive parameter&nbsp; <br />&nbsp;<br /></span><span style="color: #000000">&nbsp;tcp_keepalive alive_in;&nbsp; <br /></span><span style="color: #000000">&nbsp;tcp_keepalive alive_out;&nbsp; <br /></span><span style="color: #000000">&nbsp;alive_in.keepalivetime&nbsp;&nbsp;= 900 * 1000; // TCP连接多长时间(毫秒)没有数据就开始发送心跳包，有数据传递的时候不发送心跳包。<br /></span><span style="color: #000000">&nbsp;//系统默认2小时，我设置15分钟，不宜设置过小<br /></span><span style="color: #000000">&nbsp;alive_in.keepaliveinterval&nbsp; = 1000; //当keepalivetime时间到达后，每隔多长时间(毫秒)发送一个心跳包，发5次(系统默认值)<br /></span><span style="color: #000000">&nbsp;alive_in.onoff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = TRUE;&nbsp; <br /></span><span style="color: #000000">&nbsp;unsigned long ulBytesReturn = 0;&nbsp; <br />&nbsp;<br /></span><span style="color: #000000">&nbsp;nRet = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &amp;alive_in, sizeof(alive_in),&nbsp; <br /></span><span style="color: #000000">&nbsp;&nbsp;&amp;alive_out, sizeof(alive_out), &amp;ulBytesReturn, NULL, NULL);&nbsp; <br /></span><span style="color: #000000">&nbsp;if (nRet == SOCKET_ERROR)&nbsp; <br /></span><span style="color: #000000">&nbsp;{&nbsp; <br /></span><span style="color: #000000">&nbsp;&nbsp;TRACE("WSAIoctl failed: %d/n", WSAGetLastError());&nbsp; <br /></span><span style="color: #000000">&nbsp;&nbsp;return FALSE;&nbsp; <br /></span><span style="color: #000000">&nbsp;}&nbsp; <br /></span><span style="color: #000000">&nbsp;return TRUE;<br /></span><span style="color: #000000">}</span><span style="color: #0000ff"><br /></span><br /></div><img src ="http://www.cppblog.com/Robertxiao/aggbug/153510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Robertxiao/" target="_blank">Robertxiao</a> 2011-08-16 10:00 <a href="http://www.cppblog.com/Robertxiao/articles/153510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>