终于完全解决多线程环境Ping发生干扰的问题

asdqz1 2008-10-09 09:21:11
其实问题很简单,每个ping 都是使用SequenceId来区分的,很多时候,如果不设定SequenceId,则程序会自行分配一个,
但在多线程环境中,会将第一次分配的SequenceId重复的分给每一个线程,导致每个线程都收到不属于自己的回应包,造成干扰。
在自行加上SequenceId后,线程就能识别属于自己的回应包了。

该解决办法在delphi7+indy10 环境中得到验证,其他环境暂未测试,但根据ICMP协议的规定,
请求应答的SequenceId必须是一致的,因此加上SequenceId,多线程环境下的Ping就不会出现干扰的情况,
除非都使用了同一个SequenceId,不过如果采取随机生成的办法,估计发生冲突的几率和中国足球走向世界的几率差不多。
...全文
117 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
WinEggDrop 2008-10-09
  • 打赏
  • 举报
回复
如果你PING的是不同IP的主机的话,那么IcmpSendEcho()第6个参数返回的数据,就带有回复的IP数据.
typedef struct icmp_echo_reply { IPAddr Address; ULONG Status; ULONG RoundTripTime; USHORT DataSize; USHORT Reserved; PVOID Data; struct ip_option_information Options;
} ICMP_ECHO_REPLY, *PICMP_ECHO_REPLY;

Members
Address
The replying IPv4 address, in the form of an IPAddr structure.

检查这个回复的IP,就知道哪个是哪个了.当然这种情况只适用于PING不同的主机.


18,357

社区成员

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

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