Chinaunix首页 | 论坛 | 博客
  • 博客访问: 234924
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 296
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-22 11:52
文章分类

全部博文(31)

文章存档

2018年(3)

2017年(11)

2016年(12)

2015年(5)

我的朋友

分类: C/C++

2017-04-13 19:25:33

最近在写健康检查的插件,udp的检查打算用connect 来做,总结一下udp 判断对端服务器是否在监听对应端口的方法:

单纯判断connect 的返回值无法判断对端服务器是否在监听,因为connect 只是让内核永久维护一个存储对端地址信息的数据结构
并不会像tcp 一样去与对端服务器发生通讯,tcpdump 抓包是没有任何数据包的

connect + send 也无法判断对端服务器是否在监听端口,tcpdump 抓包能抓到icmp unreachable,但是应用层没有相关错误信息,send的返回值是正确的,用getsockopt获取socket的状态也是正确的

connect + send +recv 可以判断对端服务器是否在监听对应的端口,但是会存在以下问题,
阻塞模式下:对端服务器有在监听对应端口的话,recv 一直不会返回;对端服务如果没有在监听对应端口的话,recv会返回unreachable的错误,表明网络不可达
非阻塞模式下:无论对端服务器是否在监听端口,recv 会马上返回Resource temporarily unavailable ;尝试用while 一直recv ,如果对端服务器有在监听对应端口的话,无法判断退出时间;对端服务器要是没有在监听对应端口的话,可以通过错误码来判断,退出while;

最后决定用connect +send+recv 来实现,并且通过setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv),来指定recv的timeout
阅读(8057) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~