日期:2014-05-16  浏览次数:20738 次

能抓到icmp包,但是select超时?
select函数部分代码如下:
    while (1) {
         FD_ZERO(&readfds);
         FD_SET(pingsock, &readfds);
         maxfdp = pingsock + 1;
         timeout.tv_sec = PINGINTERVAL;      /*2s的阻塞时延 */
         timeout.tv_usec = 0;
         /* 保护select不受其他线程的信号干扰 */
         ret = select(maxfdp, &readfds, NULL, NULL, &timeout);
         if (ret <= 0) {
             switch (ret) {
             case 0:
                 DEBUG_PRINT("ping [%s] timeout, [%d] packets transmitted!\n", ping_s->pingip.ss_padding,
                     ntransmitted);
                 break;
             case -1:
                 DEBUG_PRINT("select error!\n");
                 break;
             default:
                 DEBUG_PRINT("select: error unknow!\n");
                 break;
             }
             FD_CLR(pingsock, &readfds);
        }
套接字创建部分代码如下:
    int skt;

     skt = socket(AF_INET, SOCK_RAW, 1);
     if (skt < 0) {
         APMLOG_PRINT("the skt is %d\n", skt);
     }
程序跑起来之后,一直在打印ping超时,而用wireshark抓包却能抓到发出去的和返回的icmp报文。
 请教各位,这是什么情况。哎,解决问题的一点头绪都没有啊。
select返回0的原因是没有可读文件,我这里是开多个线程来操作ping,就是说多个线程都会执行到上面这个循环,这么说的话,是不是pingsock代表的‘文件’里面没有可读信息?这是怎么回事?这程序里面,bind外部地址可以正常跑,bind内部局域网地址好像就有问题了。