有关select函数的问题

yangyi_33855 2014-01-05 01:22:10
我在收包程序中,使用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啊!
...全文
118 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangyi_33855 2014-01-08
  • 打赏
  • 举报
回复
引用 4 楼 Idle_Cloud 的回复:
select返回一,你在看看是哪个fd返回的,检查那个返回是不是有问题,有问题关闭了,应该就可以了。
谢谢你的指导,十分感谢,这几天下来终于搞好了。主要原因是因为我这里使用了多个线程调用该收包代码部门,结果打印分析包内内容发现,A线程居然收到了其他线程的包(不知道为什么A能收到服务器reply给其他线程的包,这可能使绑定的ip或socket上有问题)。于是,将不属于A线程的包丢弃(就是判读出不属于后,continue到while开头,继续等待fd状态、收包、解封装。。。等操作)。
Carl_CCC 2014-01-06
  • 打赏
  • 举报
回复
select返回一,你在看看是哪个fd返回的,检查那个返回是不是有问题,有问题关闭了,应该就可以了。
yangyi_33855 2014-01-06
  • 打赏
  • 举报
回复
顶一个,没人来么?
yangyi_33855 2014-01-05
  • 打赏
  • 举报
回复
刚重新开机试了下,发现select没有返回1了。。。不知道是何原因,但是出现的问题是: 一开始打印了:ping [172.18.3.29] timeout, [1] packets transmitted!等超时信息, 但是后面,也就是第一轮发包结束(每一轮发5个icmp请求包), 它就开始打印:Invalid argument
yangyi_33855 2014-01-05
  • 打赏
  • 举报
回复
就是说select一直返回1,帮帮忙看下问题吧。

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧