<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[浅析：setsockopt（）]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Fri, 06 Aug 2010 12:41:56 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	浅析：setsockopt（）<br/><br/><br/>1. 如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分）调用closesocket（一般不会立即关闭而经历TIME_WAIT的过程）后想继续重用该socket：<br/>BOOL bReuseaddr=TRUE;<br/>setsockopt(s，SOL_SOCKET ，SO_REUSEADDR，(const char*)&amp;bReuseaddr，sizeof(BOOL));<br/><br/><br/>2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭，不经历TIME_WAIT的过程：<br/>BOOL bDontLinger = FALSE;<br/>setsockopt(s，SOL_SOCKET，SO_DONTLINGER，(const char*)&amp;bDontLinger，sizeof(BOOL));<br/><br/><br/>3.在send()，recv()过程中有时由于网络状况等原因，发收不能预期进行，而设置收发时限：<br/>int nNetTimeout=1000;//1秒<br/>//发送时限<br/>setsockopt(socket，SOL_S0CKET，SO_SNDTIMEO，(char *)&amp;nNetTimeout，sizeof(int));<br/>//接收时限<br/>setsockopt(socket，SOL_S0CKET，SO_RCVTIMEO，(char *)&amp;nNetTimeout，sizeof(int));<br/><br/><br/>4.在send()的时候，返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节(异步);系统默认的状态发送和接收一次为8688字节(约为8.5K)；在实际的过程中发送数据和接收数据量比较大，可以设置socket缓冲区，而避免了send()，recv()不断的循环收发：<br/>// 接收缓冲区<br/>int nRecvBuf=32*1024;//设置为32K<br/>setsockopt(s，SOL_SOCKET，SO_RCVBUF，(const char*)&amp;nRecvBuf，sizeof(int));<br/>//发送缓冲区<br/>int nSendBuf=32*1024;//设置为32K<br/>setsockopt(s，SOL_SOCKET，SO_SNDBUF，(const char*)&amp;nSendBuf，sizeof(int));<br/><br/><br/>5. 如果在发送数据的时，希望不经历由系统缓冲区到socket缓冲区的拷贝而影响程序的性能：<br/>int nZero=0;<br/>setsockopt(socket，SOL_S0CKET，SO_SNDBUF，(char *)&amp;nZero，sizeof(nZero));<br/><br/><br/>6.同上在recv()完成上述功能(默认情况是将socket缓冲区的内容拷贝到系统缓冲区)：<br/>int nZero=0;<br/>setsockopt(socket，SOL_S0CKET，SO_RCVBUF，(char *)&amp;nZero，sizeof(int));<br/><br/><br/>7.一般在发送UDP数据报的时候，希望该socket发送的数据具有广播特性：<br/>BOOL bBroadcast=TRUE;<br/>setsockopt(s，SOL_SOCKET，SO_BROADCAST，(const char*)&amp;bBroadcast，sizeof(BOOL));<br/><br/><br/>8.在client连接服务器过程中，如果处于非阻塞模式下的socket在connect()的过程中可以设置connect()延时，直到accpet()被呼叫(本函数设<br/><br/>置只有在非阻塞的过程中有显著的作用，在阻塞的函数调用中作用不大)<br/>BOOL bConditionalAccept=TRUE;<br/>setsockopt(s，SOL_SOCKET，SO_CONDITIONAL_ACCEPT，(const char*)&amp;bConditionalAccept，sizeof(BOOL));<br/><br/><br/>9.如果在发送数据的过程中(send()没有完成，还有数据没发送)而调用了closesocket()，以前我们一般采取的措施是&quot;从容关闭&quot;shutdown(s，<br/><br/>SD_BOTH)，但是数据是肯定丢失了，如何设置让程序满足具体应用的要求(即让没发完的数据发送出去后在关闭socket)？<br/>struct linger &#123;<br/>u_short l_onoff;<br/>u_short l_linger;<br/>&#125;;<br/>linger m_sLinger;<br/>m_sLinger.l_onoff=1;//(在closesocket()调用，但是还有数据没发送完毕的时候容许逗留)<br/>// 如果m_sLinger.l_onoff=0;则功能和2.)作用相同;<br/>m_sLinger.l_linger=5;//(容许逗留的时间为5秒)<br/>setsockopt(s，SOL_SOCKET，SO_LINGER，(const char*)&amp;m_sLinger，sizeof(linger));<br/>Note:1.在设置了逗留延时，用于一个非阻塞的socket是作用不大的，最好不用;2.如果想要程序不经历SO_LINGER需要设置SO_DONTLINGER，或<br/><br/>者设置l_onoff=0；<br/><br/><br/>10.还一个用的比较少的是在SDI或者是Dialog的程序中，可以记录socket的调试信息：<br/>(前不久做过这个函数的测试，调式信息可以保存，包括socket建立时候的参数，采用的<br/>具体协议，以及出错的代码都可以记录下来）<br/>BOOL bDebug=TRUE;<br/>setsockopt(s，SOL_SOCKET，SO_DEBUG，(const char*)&amp;bDebug，sizeof(BOOL));<br/><br/><br/>11.附加：往往通过setsockopt()设置了缓冲区大小，但还不能满足数据的传输需求，我的习惯是自己写个处理网络缓冲的类，动态分配内存;<br/><br/><br/>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/ast_224/archive/2008/11/14/3111347.aspx<br/>
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] 浅析：setsockopt（）]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>