LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1425|回复: 10

多线程ping实现问题

[复制链接]
发表于 2005-6-14 10:10:49 | 显示全部楼层 |阅读模式
我的思路是单线程的ping是好实现的,那么我开N个线程,每个线程都执行这样一个流程  
初始化    socket()      sendto()    select()  recvfrom()  结束  
但是,有这样一个情况。  
s1  s2两个sock分别属于A、B两个线程,  
s1会收到回应s2的ICMP回应数据包  

我猜想  ICMP是在IP层上的,没有端口,无法多路复用,无法区分是属于哪个sock的数据

我想若把每个发送ICMP数据包的ID域填入当前发送线程的ID号,每个线程都在接收回应数据包,通过比较ID号来判断接收的数据包是否是此线程发送的回应,若是就进行下步操作,不是就丢弃.但这里有个问题:一个线程丢弃一个不是他的回应数据包后,这个被丢弃的数据包时候能被其他线程接收到?(当然包括要正确接收这个回应数据包的线程),若一个线程丢弃了一个数据包后其他线程接受不到,那么不就造成了一个线程的回应数据包丢失吗?

所以我想请教各位高手,多线程ping各位的实现思路是怎么样的
发表于 2005-6-14 13:45:29 | 显示全部楼层
用一个共享的ID号, 从1开始, 每个线程用互斥锁访问这个ID号,线程每发一个包,将ID号加1。设置一个共享的变量统计已接收到的数据的数目,线程收到一个ICMP包,就和ID比较,如果是正常的ICMP应答,且其数据中的ID号小于等于共享的ID,则认为是好的ICMP应答,共享的计数值加1。
如果要确认是针对自己发出的ICMP请求的应答,则应对ICMP请求的数据和ICMP回复的数据进行比较。
回复 支持 反对

使用道具 举报

发表于 2005-6-14 13:55:01 | 显示全部楼层
没做过这个这个,不过你可以从ICMP里面的sequence number下手吧~一个ping 和一个 ping reply的seq no是一样的,而且唯一
回复 支持 反对

使用道具 举报

发表于 2005-6-14 22:07:35 | 显示全部楼层
有一个socket option,让数据读完之后仍然在buffer里,你试试行不行。
不过,ping要多线程做什么?
回复 支持 反对

使用道具 举报

发表于 2005-6-15 10:40:05 | 显示全部楼层
sorry, 说错!如果多个线程各自打开一个raw socket,则每个icmp包各个socket都能收到,不用担心数据包丢失。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-15 15:46:51 | 显示全部楼层
呵呵,谢谢!要求是多线程的同时PING多个主机,还是IPV6的.好象有的和V4下的有些地方不大一样啊,比如校验和的计算?还有剥开收到的IP6数据包时候,到ICMP6的包头是不是就是40个字节呢?我正查资料呢.V6的书原理的多具体实现的少.有没有人有这方面的资料?最好给段源码呀. :-)
回复 支持 反对

使用道具 举报

发表于 2005-6-15 20:44:43 | 显示全部楼层
我前面有一个tcp端口扫描的程序,里面用到了IPv6 ICMP。你可以到精华区里找一下。
回复 支持 反对

使用道具 举报

发表于 2005-6-18 17:36:51 | 显示全部楼层
Post by Tetris
我前面有一个tcp端口扫描的程序,里面用到了IPv6 ICMP。你可以到精华区里找一下。


精华区指的是这个版面的论坛索引吗?不是的话,能给贴个网址吗,谢谢!!
回复 支持 反对

使用道具 举报

发表于 2005-6-18 17:54:08 | 显示全部楼层
搜我发的主题吧。我一共也没发过几个主题。
回复 支持 反对

使用道具 举报

发表于 2005-6-18 18:27:02 | 显示全部楼层
找到了!!深表感谢。还望高手继续不吝发帖指点,呵呵
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表