Chinaunix

标题: 应用程序如何得知网络状态,比如网络电缆没插好或者外网突然无法访问[已解决] [打印本页]

作者: yao3gang    时间: 2013-10-14 22:44
标题: 应用程序如何得知网络状态,比如网络电缆没插好或者外网突然无法访问[已解决]
本帖最后由 crazyhadoop 于 2013-10-27 22:57 编辑

无论windows还是linux在状态栏上都有显示网络状态的图标,它可以反映出网络的一些状态。
而在应用程序中该如何检查网络状态并做好出错后的处理?
比如我拔下网络线缆或者路由器突然与外网失去连接亦或服务器突然当机,我的应用程序如何检测并后续处理?
如果每个网络应用程序都自己检查网络状态,是不是感觉大家都在做重复的事情?
作者: myworkstation    时间: 2013-10-15 16:51
回复 1# yao3gang


    Linux 下可以用:
  1. // if_name like "ath0", "eth0". Notice: call this function // need root privilege. // return value: 
  2. // -1 -- error , details can check errno // 1 -- interface link up // 0 -- interface link down. 
  3. int get_netlink_status(const char *if_name) { 
  4.     int skfd;     struct ifreq ifr; 
  5.     struct ethtool_value edata;     edata.cmd = ETHTOOL_GLINK;     edata.data = 0; 
  6.     memset(&ifr, 0, sizeof(ifr)); 
  7.     strncpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name) - 1);     ifr.ifr_data = (char *) &edata; 
  8.     if (( skfd = socket( AF_INET, SOCK_DGRAM, 0 )) < 0)         return -1; 
  9.     if(ioctl( skfd, SIOCETHTOOL, &ifr ) == -1)     { 
  10.         close(skfd);         return -1;     } 
  11.     close(skfd);     return edata.data; } 
复制代码
Windows下最简单的办法是使用InternetGetConnectedState,此外还可以使用wmi的方式检查MSNdis_MediaConnectStatus。或者GetAdaptersInfo+GetIfEntry并检查MIB_IFROW的dwOperStatus

作者: yao3gang    时间: 2013-10-19 22:06
谢谢你的回复, 正是我需要的
作者: linux_c_py_php    时间: 2013-10-20 19:59
都需要做应用层心跳报文, 没办法.
作者: AssassinPig    时间: 2013-10-26 11:52
询问有搞移动端的么,是否也有发送心跳




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2