多线程下的ping程序如何防止接收的混乱?

smilingdog 2003-08-21 03:29:42
我用raw_socket,
建立socket时使用connect(sockRaw, (struct sockaddr*)&dest, sizeof(dest))来将socket与目标ip地址绑定,
分别用send和recv来发送和接收数据包,根据MSDN上说,使用这两个函数可以建立一一对应的发送接收关系,可以防止混乱
在多线程(每个线程对应一个ip)中使用如上方法,则对一个子网(254台主机)进行ping操作的时候,一开始还是会发生接收到其他线程发送的ping包的情况,后来我在开启每个线程之间用sleep设置一定的时间间隔(50-80ms),则以上现象消失,但是我觉得这不是一个好的解决方法,毕竟浪费了一定的时间,想请教各位为何会出现接收混乱的情况,既然我已经使用connect和send/recv
...全文
72 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
_china 2004-02-11
  • 打赏
  • 举报
回复
我的代码给每个IP发的包当然不止一个,程式运行很好,几秒中测出一个网段。
yangbc 2004-02-09
  • 打赏
  • 举报
回复
顶一下
jiangfb 2004-02-09
  • 打赏
  • 举报
回复
To _china:
你要是给同一个IP发了不至一个请求包,怎么办?
你的方法不保险
_china 2004-02-09
  • 打赏
  • 举报
回复
我碰到过你这种情况,我把线程接收包的ip和该线程所应处理的ip比较了一下,结果OK.
citycuriser 2004-02-09
  • 打赏
  • 举报
回复
方案一、根据楼上意见。可以把每个线程的ID作为ICMP包的数据发送出去,把接受返回的数据包的内容与接受的这个线程ID做比较。(send,recevie在同一个线程)

方案二、比较发出去ICMP包的ID值(不一定是线程的)与收到的ICMP包的ID值。
jiangfb 2004-02-09
  • 打赏
  • 举报
回复
ping出去的ICMP包中数据段内容和回来是相同的
设ICMP header的指针为iheader,那么iheader+8向后的内容是相同的
只要每次能保证每次出去的包的内容不是一样的话,就能分辨了
多线程的ping可以在该线程的包发送时做一个能标志该线程的记号
tianxiangyuan 2004-02-09
  • 打赏
  • 举报
回复
将线程id放入icmp的头部

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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