• 主页
  • 系统维护与使用
  • 应用程序开发
  • 内核源代码
  • 驱动程序开发
  • CPU和硬件区
  • UNIX文化
  • Solaris
  • Power Linux

SO_KEEPALIVE socket

program2050 2014-01-17 04:35:56
今天看到一段代码:
(setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void*)&on, sizeof(on))<0)

这个fd是负责listen的套接字。


为啥是对listen的套接字设置 SO_KEEPALIVE呢?
和accept得到的套接字设置 SO_KEEPALIVE 有什么区别呢?
...全文
183 点赞 收藏 14
写回复
14 条回复
wcg_jishuo 2014年02月12日
我也想知道。
回复 点赞
program2050 2014年01月23日
再求大神。。。。。。。。。。。。。。。。。。。
回复 点赞
max_min_ 2014年01月18日
设置报活吧!不过没啥实际作用! 最好还是自己加一天报活的线程,比较靠谱!
回复 点赞
xiaolomg 2014年01月18日
引用 2 楼 program2050 的回复:
客户端直接拔掉网线,libevent 在5分钟后就探测到,并关闭这个客户端的连接。 但是我一直没在libevent的源码里面找得真相。。。。 libevent 在epoll模式下,应该都是一直在epoll_wait上等待的,但是把客户端网线拔掉, 5分钟后,libevent 醒来,close掉了那个客户端的连接。 坐等高手。
如果拔掉网线,那么client就不会发送tcp alive的消息,server在两个时间间隔没收到就认为此链接已死,就断开。
回复 点赞
Vegertar 2014年01月18日
这个选项设置在listenfd上,acceptedfd是可以继承的。具体请看UNP vol1。 区别的话,最直观的是如果希望所有连接都设置则不用多次调用。
回复 点赞
program2050 2014年01月18日
补充一下背景: libevent里面的
evconnlistener_new_bind
才会有SO_KEEPALIVE的设置,当然是没有其他的TCP_KEEPIDLE,TCP_KEEPINTVL等的设置,这些使用的都是内核参数,即2个小时等。。。 用了evconnlistener_new_bind,5分钟内就检测不到客户端的网络异常(拔掉网线),这个可以理解。 但是如果是自己做完,bind,listen等工作后,再通过event_set,event_base_set,event_add等操作进入 event_base_loop的时候,即没有SO_KEEPALIVE的时候,反而能 5分钟内检测到客户端拔掉网线。 不明白为什么??跪求大神。
回复 点赞
program2050 2014年01月18日
引用 9 楼 Vegertar 的回复:
[quote=引用 8 楼 program2050 的回复:] [quote=引用 4 楼 Vegertar 的回复:] 这个选项设置在listenfd上,acceptedfd是可以继承的。具体请看UNP vol1。 区别的话,最直观的是如果希望所有连接都设置则不用多次调用。
试了一下,果然如此。 不过libevent那个5分钟问题,我还是没搞懂。[/quote] 没看过libevent的源码,当你说它5分钟后醒来关了连接,八成是wait到了EPOLLHUP了,keepalive不就是干这个的?TCP定时器超时后close连接,然后epoll_wait返回。至于5分钟,keepalive也有cnt和interval的选项,你也可以改成5小时。[/quote] 我之前也是这么觉得的,但是看了libevent的代码,根本没有这些设置。 不知道还有没有其他的机制,很纳闷。。。。求解。
回复 点赞
Vegertar 2014年01月18日
补充一下,keepalive下,TCP定时器超时后发出探测报文,对端始终不响应(周期由cnt和interval配置)则close连接。
回复 点赞
Vegertar 2014年01月18日
引用 8 楼 program2050 的回复:
[quote=引用 4 楼 Vegertar 的回复:] 这个选项设置在listenfd上,acceptedfd是可以继承的。具体请看UNP vol1。 区别的话,最直观的是如果希望所有连接都设置则不用多次调用。
试了一下,果然如此。 不过libevent那个5分钟问题,我还是没搞懂。[/quote] 没看过libevent的源码,当你说它5分钟后醒来关了连接,八成是wait到了EPOLLHUP了,keepalive不就是干这个的?TCP定时器超时后close连接,然后epoll_wait返回。至于5分钟,keepalive也有cnt和interval的选项,你也可以改成5小时。
回复 点赞
program2050 2014年01月18日
引用 4 楼 Vegertar 的回复:
这个选项设置在listenfd上,acceptedfd是可以继承的。具体请看UNP vol1。 区别的话,最直观的是如果希望所有连接都设置则不用多次调用。
试了一下,果然如此。 不过libevent那个5分钟问题,我还是没搞懂。
回复 点赞
program2050 2014年01月18日
引用 5 楼 max_min_ 的回复:
设置报活吧!不过没啥实际作用! 最好还是自己加一天报活的线程,比较靠谱!
嗯。只是最近在看libevent的源码,觉得有点好奇。功力没够,没发现,为什么libevent能在5分钟检测到客户端网络出异常(拔掉网线)。 按理说,libevent应该傻傻的在epoll_wait上等待客户端的 EV_READ事件才对。。。
回复 点赞
program2050 2014年01月18日
引用 3 楼 boyhailong 的回复:
[quote=引用 2 楼 program2050 的回复:] 客户端直接拔掉网线,libevent 在5分钟后就探测到,并关闭这个客户端的连接。 但是我一直没在libevent的源码里面找得真相。。。。 libevent 在epoll模式下,应该都是一直在epoll_wait上等待的,但是把客户端网线拔掉, 5分钟后,libevent 醒来,close掉了那个客户端的连接。 坐等高手。
如果拔掉网线,那么client就不会发送tcp alive的消息,server在两个时间间隔没收到就认为此链接已死,就断开。[/quote] 但是libevent 在5分钟的时候,就检测到,并且断开了。为什么是5分钟。?
回复 点赞
program2050 2014年01月17日
客户端直接拔掉网线,libevent 在5分钟后就探测到,并关闭这个客户端的连接。 但是我一直没在libevent的源码里面找得真相。。。。 libevent 在epoll模式下,应该都是一直在epoll_wait上等待的,但是把客户端网线拔掉, 5分钟后,libevent 醒来,close掉了那个客户端的连接。 坐等高手。
回复 点赞
空的 2014年01月17日
只知道有这么个选项,还没用过呢 是不是有继承效果还是咋滴~~~ 坐等高手
回复 点赞
发动态
发帖子
Linux/Unix社区
创建于2007-08-27

7069

社区成员

7.3w+

社区内容

Linux/Unix社区 应用程序开发区
社区公告
暂无公告