能抓到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内部局域网地址好像就有问题了。
[解决办法]
bind外网ok,bind内网有问题,那ping是外网ip还是内网ip呢?抓包看下,返回的icmp中ip头的目的地址是外网还是内的呢?