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 有什么区别呢?
...全文
261 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
AIGPTchina 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
  • 打赏
  • 举报
回复
只知道有这么个选项,还没用过呢 是不是有继承效果还是咋滴~~~ 坐等高手

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧