posts - 68, comments - 8, trackbacks - 0, articles - 0
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

如何增强网络通信的健壮性?

Posted on 2010-04-14 09:56 Richmond 阅读(764) 评论(0)  编辑 收藏 引用 所属分类: 网络
参考:http://www.javaeye.com/topic/492652
1.如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)调用closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket就要把它的属性设置成可以重复利用。这样有利于断线后的重连。

2.如果要将已经处于连接状态的socket在调用closesocket后强制关闭,不经历TIME_WAIT的过程,直接把这个Socket的SO_DONTLINGER这个属性设置掉。对于提高通信效率有比较好的帮助。

3.在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而这个时候就要设置收发时限,以增加socket在网络故障中的敏感程度,对于断线等网络异常立即做出反应。系统也好在短时间内做出相映的应对策略。

4.在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节(异步);系统默认的状态发送和接收一次为8688字节 (约为8.5K);在实际的过程中发送数据和接收数据量比较大,可以设置socket缓冲区,而避免了send(),recv()不断的循环收发。

5.如果在发送数据的时,希望不经历由系统缓冲区到socket缓冲区的拷贝而影响程序的性能,可以通过设置Socket的SO_SNDBUF属性来增加对发送数据的实际情况的了解。

6.同上在recv()完成上述功能(默认情况是将socket缓冲区的内容拷贝到系统缓冲区),增加系统对连接过程控制能力。

7.在client连接服务器过程中,如果处于非阻塞模式下的socket在connect()的过程中可以设置connect()延时,直到accpet()被呼叫(本函数设置只有在非阻塞的过程中有显著的作用,在阻塞的函数调用中作用不大)。

8.如果在发送数据的过程中(send()没有完成,还有数据没发送)而调用了closesocket(),以前我们一般采取的措施是"从容关闭"shutdown(s,SD_BOTH),但是数据是肯定丢失了,设置Socket的SO_LINGER属性让程序满足具体应用的要求(即让没发完的数据发送出去后再关闭socket)。(在closesocket()调用,但是还有数据没发送完毕的时候容许逗留)。注意:1.在设置了逗留延时,用于一个非阻塞的socket是作用不大的,最好不用; 2.如果想要程序不经历SO_LINGER需要设置SO_DONTLINGER,或者设置l_onoff=0;

9.在SDI或者是Dialog的程序中,可以记录socket的调试信息:(做函数的测试,调式信息可以保存,包括socket建立时候的参数,采用的具体协议,以及出错的代码都可以记录下来)就设置这个参数SO_DEBUG

10.往往通过setsockopt()设置了缓冲区大小,但还不能满足数据的传输需求,一般的习惯是自己写个处理网络缓冲的类,动态分配内存。
只有注册用户登录后才能发表评论。