﻿<?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>IT博客-Richmond-随笔分类-网络</title><link>http://www.cnitblog.com/Richmond/category/8662.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 15:15:38 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 15:15:38 GMT</pubDate><ttl>60</ttl><item><title>如何增强网络通信的健壮性？</title><link>http://www.cnitblog.com/Richmond/archive/2010/04/14/65266.html</link><dc:creator>Richmond</dc:creator><author>Richmond</author><pubDate>Wed, 14 Apr 2010 01:56:00 GMT</pubDate><guid>http://www.cnitblog.com/Richmond/archive/2010/04/14/65266.html</guid><wfw:comment>http://www.cnitblog.com/Richmond/comments/65266.html</wfw:comment><comments>http://www.cnitblog.com/Richmond/archive/2010/04/14/65266.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/Richmond/comments/commentRss/65266.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/Richmond/services/trackbacks/65266.html</trackback:ping><description><![CDATA[<div style="POSITION: relative" _madePositioned="true">参考：<a href="http://www.javaeye.com/topic/492652">http://www.javaeye.com/topic/492652</a><br>1．如果在已经处于 ESTABLISHED状态下的socket（一般由端口号和标志符区分）调用closesocket（一般不会立即关闭而经历TIME_WAIT的过程）后想继续重用该socket就要把它的属性设置成可以重复利用。这样有利于断线后的重连。 <br><br>2．如果要将已经处于连接状态的socket在调用closesocket后强制关闭，不经历TIME_WAIT的过程，直接把这个Socket的SO_DONTLINGER这个属性设置掉。对于提高通信效率有比较好的帮助。 <br><br>3．在send()，recv()过程中有时由于网络状况等原因，发收不能预期进行，而这个时候就要设置收发时限，以增加socket在网络故障中的敏感程度，对于断线等网络异常立即做出反应。系统也好在短时间内做出相映的应对策略。 <br><br>4．在send()的时候，返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节(异步)；系统默认的状态发送和接收一次为8688字节 (约为8.5K)；在实际的过程中发送数据和接收数据量比较大，可以设置socket缓冲区，而避免了send()，recv()不断的循环收发。 <br><br>5．如果在发送数据的时，希望不经历由系统缓冲区到socket缓冲区的拷贝而影响程序的性能，可以通过设置Socket的SO_SNDBUF属性来增加对发送数据的实际情况的了解。 <br><br>6．同上在recv()完成上述功能(默认情况是将socket缓冲区的内容拷贝到系统缓冲区)，增加系统对连接过程控制能力。 <br><br>7．在client连接服务器过程中，如果处于非阻塞模式下的socket在connect()的过程中可以设置connect()延时，直到accpet()被呼叫(本函数设置只有在非阻塞的过程中有显著的作用，在阻塞的函数调用中作用不大)。 <br><br>8．如果在发送数据的过程中(send()没有完成，还有数据没发送)而调用了closesocket()，以前我们一般采取的措施是"从容关闭"shutdown(s，SD_BOTH)，但是数据是肯定丢失了，设置Socket的SO_LINGER属性让程序满足具体应用的要求(即让没发完的数据发送出去后再关闭socket)。(在closesocket()调用，但是还有数据没发送完毕的时候容许逗留)。注意：1.在设置了逗留延时，用于一个非阻塞的socket是作用不大的，最好不用; 2.如果想要程序不经历SO_LINGER需要设置SO_DONTLINGER，或者设置l_onoff=0； <br><br>9．在SDI或者是Dialog的程序中，可以记录socket的调试信息：(做函数的测试，调式信息可以保存，包括socket建立时候的参数，采用的具体协议，以及出错的代码都可以记录下来）就设置这个参数SO_DEBUG <br><br>10．往往通过setsockopt()设置了缓冲区大小，但还不能满足数据的传输需求，一般的习惯是自己写个处理网络缓冲的类，动态分配内存。</div>
<img src ="http://www.cnitblog.com/Richmond/aggbug/65266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/Richmond/" target="_blank">Richmond</a> 2010-04-14 09:56 <a href="http://www.cnitblog.com/Richmond/archive/2010/04/14/65266.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>