免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4283 | 回复: 9
打印 上一主题 下一主题

[网络] select函数的问题,总是返回1. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-05 14:49 |只看该作者 |倒序浏览
我在收包程序中,使用select函数来判断是否接受超时,结果,当网络不通时(ping不通,我发送的也是icmp请求报文),select函数也是返回的正值。
代码如下:
…………………………
send:
     /* start the ping's going ... */
     apmlog_send_icmp_pkt(pthd_para);

     /* listen for replies */
     while (1) {
         FD_ZERO(&readfds);
         FD_SET(pthd_para->pingsock, &readfds);
         maxfdp = pthd_para->pingsock + 1;
         timeout.tv_sec = PINGINTERVAL;      /* 2s的阻塞时延 */
         timeout.tv_usec = 0;

         slc_ret = select(maxfdp, &readfds, NULL, NULL, &timeout);
         printf("select func ret is %d\n", slc_ret);
         if (slc_ret <= 0) {
             switch (ret) {
             case 0:
                 printf("ping [%s] timeout, [%d] packets transmitted!\n", pthd_para->ping_addr,
                     pthd_para->ntransmitted);
                 break;
             default:
                 printf("select: error unknow!\n");
                 break;
             }
             //FD_CLR(pthd_para->pingsock, &readfds);
             if (pthd_para->ntimes > pthd_para->ntransmitted) {
                 goto send;
             } else {
                 break;
             }
         }
……………………………………
我给一个ping不通的ip发包,其测试结果:
select func ret is 1

这是怎么回事呢?ping不通,没有reply包返回,ret应该是为0啊!
现在一直返回1,论坛里面有个帖子,说的是tcp的,也是select一直返回1,我按他的方法,改过端口号,还是不行,估计是发送的报文类型不一样,他的是tcp的,我的是icmp报文。

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
2 [报告]
发表于 2014-01-06 01:09 |只看该作者
select 之后perror一下看看? 权限不对?permission问题么?

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
3 [报告]
发表于 2014-01-06 03:31 |只看该作者
返回1,perror应当不起作用
抓包看看发了什么数据包,收到了什么数据包

论坛徽章:
0
4 [报告]
发表于 2014-01-06 09:15 |只看该作者
crazyhadoop 发表于 2014-01-06 01:09
select 之后perror一下看看? 权限不对?permission问题么?

我重新起机后,再perror,首先第一轮发包(每轮发5个icmp请求包),打印出了“超时”的提示的信息,然后从第二轮开打印invalid arguments了。这应该不是权限问题吧,我是在root权限编译、运行的呀

论坛徽章:
0
5 [报告]
发表于 2014-01-06 09:16 |只看该作者
回复 3# 井蛙夏虫
ok

论坛徽章:
0
6 [报告]
发表于 2014-01-06 10:47 |只看该作者
井蛙夏虫 发表于 2014-01-06 03:31
返回1,perror应当不起作用
抓包看看发了什么数据包,收到了什么数据包

抓了包,分析ip头里面的源ip、目的ip发现,目的ip是本机,但是源ip A不是该pingsocket的发出报文的目的ip ,是其他socket的(我还开了个线程再发icmp请求报文,那个源ip A就是这个线程的目的ip),不知道为什么,是没做好互斥吗?我打印看了readfds的地址,两个线程(pingsocket与其他socket)的是不一样的啊。

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
7 [报告]
发表于 2014-01-06 20:19 |只看该作者
回复 6# yangyi33855
没看懂说什么

   

论坛徽章:
0
8 [报告]
发表于 2014-01-08 12:35 |只看该作者
井蛙夏虫 发表于 2014-01-06 20:19
回复 6# yangyi33855
没看懂说什么

抓包时,程序的配置和抓包解析结果是这样的:
线程A 发icmp包的目的ip ipA,
线程B 发icmp包的目的ip ipB,
抓到的包的解析结果:
线程A中,收到icmp报文有两种 源ip为ipA和源ip为ipB的icmp应答包
线程B中收到的包和线程A也一样,两种。
而我期待的正确的结果是:线程A只收到源ip为ipA的icmp应答包,线程B只收到源ip为ipB的icmp应答包。
问题:某个为什么会收到别的线程的报文呢,我给每个线程都单独创建了socket的,而且只在线程退出时才close?

论坛徽章:
0
9 [报告]
发表于 2014-01-08 16:08 |只看该作者
井蛙夏虫 发表于 2014-01-06 20:19
回复 6# yangyi33855
没看懂说什么

请教一下,select函数中,是如何判断文件描述符状态发生改变的?

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
10 [报告]
发表于 2014-01-08 20:13 |只看该作者
回复 9# yangyi33855
select是怎么实现的,我不知道。但我觉得这与select无关。
你不应当将raw socket当作tcp socket用,你可以看看unp25.4节的内容。

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP