浏览 3120 次
锁定老帖子 主题:如何增强网络通信的健壮性
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-10-17
最后修改:2009-10-28
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()设置了缓冲区大小,但还不能满足数据的传输需求,一般的习惯是自己写个处理网络缓冲的类,动态分配内存。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |