注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

epoll的总结之一基本的参数设置  

2014-06-20 09:57:38|  分类: 网络服务编程技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

epoll的总结之一基本的参数设置

在前面的博文中也不断的探索和分析过epoll这个模型,对他的优缺点也进行了一些总结,但对其的认知还是停留在感性和碎片化的状态,这次就把总结起来,算是对整个网络编程的一个再次深入的理解分析以及对其整体思想上把握的再一次自我的否定之否定的总结。

在网络编程中,经常遇到的是要对端口进行重用,举一个简单的例子,你的客户端在不绑定指定的端口的情况下,会自动的不断的增长你的端口号,那么如何把这个端口号固定起来或者说固定到一个范围呢?大家知道在TCP/IP协议中,在TIME_WIAT状态一般需要2MSL(一般大约是四分钟左右,更详细看前面的“Socket TIME_WAIT 问题”),这个时候儿的端口是无法使用的。要想使用它,就得使用下面的方法通知内核:

    unsigned int optReuse = 0x01;

setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&optReuse,sizeof(int));

另外关于重用端口等高级问题可以查看《UNIX网络编程》,写得之清楚。需要说明:

一个套接字由相关五元组构成,协议、本地地址、本地端口、远程地址、远程端口。SO_REUSEADDR 仅仅表示可以重用本地本地地址、本地端口,整个相关五元组还是唯一确定的。所以,重启后的服务程序有可能收到非期望数据。必须慎重使用 SO_REUSEADDR 选项。

同样还要处理优雅的关闭的问题或者说CLOSE_WAIT的问题:在客户端如果客户和服务端在关闭时四次握手没有完成,也就是客户端只是回答了服务端的关闭,(两次握手)却没有调用closesocket发送FIN请求,那么,客户端便一直处于CLOSE_WAIT状态(服务器端处于FIN_WIAT_2状态),然后会导致大量的端口无法释放。

同样,如果客户端和服务端的关闭方式交换,那么产生的现象也是一样的,更详细的说明见转载的“SOCKET CLOSE_WAIT状态的说明”那么处理的方法如下(首先是上面保证 端口重用):

    struct linger optLinger;

    optLinger.l_onoff = 1;

    optLinger.l_linger = 60;

setsockopt(listenfd,SOL_SOCKET,SO_LINGER,&optLinger,sizeof(struct linger));

所以说,写SOCKET通信,其中的水儿还是比较深的,要深入理解协议的内容,才能更好更高效的写出健壮的网络通信程序。

  评论这张
 
阅读(472)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017