Chinaunix首页 | 论坛 | 博客
  • 博客访问: 659
  • 博文数量: 1
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2017-05-04 17:37
文章分类
文章存档

2017年(1)

我的朋友
最近访客

分类: C/C++

2017-05-08 13:48:29

原文地址:udp connect 总结 作者:philarlala

最近在写健康检查的插件,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
阅读(47) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~