免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: tyq7821
打印 上一主题 下一主题

在程序中如何检测出网络断开(直接拔掉网线来测试)? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2005-09-26 14:52 |只看该作者

在程序中如何检测出网络断开(直接拔掉网线来测试)?

<unix网络编程第一卷>;stevens p113关于这种情况的叙述,提到会返回ETIMEDOUT,但是linux实际上不会.

论坛徽章:
0
12 [报告]
发表于 2005-09-26 14:58 |只看该作者

在程序中如何检测出网络断开(直接拔掉网线来测试)?

我没那书
抱歉

论坛徽章:
0
13 [报告]
发表于 2005-09-26 14:58 |只看该作者

在程序中如何检测出网络断开(直接拔掉网线来测试)?

安道理最多3分钟write就该出错返回了
按照默认设置,(SO_SNDTIMEO的timeval tv_sec=0 tv_usec=0)将会一直阻塞.
steven书(同上一本书)中p113说bsd4.3会重发,等待大概9分钟.然后会放弃连接,但是linux不会这样.

论坛徽章:
0
14 [报告]
发表于 2005-09-26 15:00 |只看该作者

在程序中如何检测出网络断开(直接拔掉网线来测试)?

bleem1998     
天使  谢谢参与讨论.

论坛徽章:
0
15 [报告]
发表于 2005-09-26 15:05 |只看该作者

在程序中如何检测出网络断开(直接拔掉网线来测试)?

补充,大概十多分钟后write收到EPIPE信号(从装满socket buffer),read还在阻塞.

论坛徽章:
0
16 [报告]
发表于 2005-09-26 15:17 |只看该作者

在程序中如何检测出网络断开(直接拔掉网线来测试)?

恭喜恭喜
read估计也快出错了
呵呵

论坛徽章:
0
17 [报告]
发表于 2005-09-26 15:21 |只看该作者

在程序中如何检测出网络断开(直接拔掉网线来测试)?

呵呵,还没出错,气死我了.

论坛徽章:
0
18 [报告]
发表于 2005-09-27 11:53 |只看该作者

在程序中如何检测出网络断开(直接拔掉网线来测试)?

@FreeBSD的代码.以前的贴在nettf.net里的,当时赶着用,我就是c&p了一下ifconfig,很凌乱,不知道是否符合你的要求:
firewall# cat test.c

  1. #include <ctype.h>;
  2. #include <err.h>;
  3. #include <errno.h>;
  4. #include <stdio.h>;
  5. #include <stdlib.h>;
  6. #include <string.h>;
  7. #include <unistd.h>;

  8. #include <sys/ioctl.h>;
  9. #include <sys/socket.h>;
  10. #include <net/if.h>;
  11. #include <net/if_types.h>;
  12. #include <net/if_media.h>;

  13. int
  14. main(int argc,char **argv)
  15. {
  16.        int s;
  17.        struct ifreq ifr;
  18.        struct ifmediareq ifmr;
  19.        int *media_list;
  20.        char name[IFNAMSIZ];
  21.       
  22.        if(2 != argc){
  23.            printf("Usage:\ntest cardname(e.g: vr0)\n");
  24.            return 1;
  25.        }   
  26.       
  27.        strncpy(name, argv[1], sizeof(name));
  28.       
  29.        ifr.ifr_addr.sa_family = AF_INET;
  30.        strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
  31.        if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)
  32.                err(1, "socket");

  33.        (void) memset(&ifmr, 0, sizeof(ifmr));
  34.        (void) strncpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));

  35.        if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0)
  36.                err(1, "SIOCGIFMEDIA");
  37.        if (ifmr.ifm_count == 0) {
  38.                warnx("%s: no media types?", name);
  39.                return;
  40.        }

  41.        media_list = (int *)malloc(ifmr.ifm_count * sizeof(int));
  42.        if (media_list == NULL)
  43.                err(1, "malloc");
  44.        ifmr.ifm_ulist = media_list;

  45.        if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0)
  46.                err(1, "SIOCGIFMEDIA");

  47.        if (ifmr.ifm_status & IFM_AVALID) {
  48.                printf("\tstatus: ");
  49.                switch (IFM_TYPE(ifmr.ifm_active)) {
  50.                case IFM_ETHER:
  51.                        if (ifmr.ifm_status & IFM_ACTIVE)
  52.                                printf("active");
  53.                        else
  54.                                printf("no carrier");
  55.                        break;

  56.                case IFM_FDDI:
  57.                case IFM_TOKEN:
  58.                        if (ifmr.ifm_status & IFM_ACTIVE)
  59.                                printf("inserted");
  60.                        else
  61.                                printf("no ring");
  62.                        break;

  63.                case IFM_ATM:
  64.                        if (ifmr.ifm_status & IFM_ACTIVE)
  65.                                printf("active");
  66.                        else
  67.                                printf("no carrier");
  68.                        break;

  69.                case IFM_IEEE80211:
  70.                        if (ifmr.ifm_status & IFM_ACTIVE)
  71.                                printf("associated");
  72.                        else
  73.                                printf("no carrier");
  74.                        break;
  75.                }
  76.                putchar('\n');
  77.        }

  78.        free(media_list);
  79.        return 0;
  80. }
复制代码


firewall# gcc test.c -o test
firewall# test vr0
        status: active
firewall# test vr1
        status: active
firewall# test vr2
test: SIOCGIFMEDIA: Device not configured

论坛徽章:
0
19 [报告]
发表于 2005-09-27 12:08 |只看该作者

在程序中如何检测出网络断开(直接拔掉网线来测试)?

对噢,这事实上并非狭义上的检测网线是否插上.
而是针对"网卡是否有效地连接到一个可以工作的网络里"^_^

论坛徽章:
8
白羊座
日期:2015-01-21 18:35:03巳蛇
日期:2015-02-03 17:30:37处女座
日期:2015-02-03 17:31:02羊年新春福章
日期:2015-02-03 17:31:21巨蟹座
日期:2015-02-05 16:01:06申猴
日期:2015-02-05 16:01:31摩羯座
日期:2015-02-05 16:01:41酉鸡
日期:2015-02-05 16:02:37
20 [报告]
发表于 2005-09-27 16:54 |只看该作者

在程序中如何检测出网络断开(直接拔掉网线来测试)?

select会立刻返回,显示有数据到来,但是read的时候会发现数据长度为0
此时,基本上可以判断是对方断开了连接,可能是主动关闭的连接,也可能是网络的问题,包括拔掉网线
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP