重新讨论:多线程环境下的 Ping 程序设计 ,up有分(夜林箭)

CCED136 2003-01-06 02:56:06
在一般的网络应用程序中,我们经常会使用到 Ping ,这对于

我们的程序是一个很实用的功能。可是,我写的 Ping 程序却不能

工作在多线程环境下。

比如:用 BCB 撰写一个独立的 PING 程序,程序运行一个实例,

功能一切正常,如果同时运行两个甚至更多的实例,这个 PING 程序

就会出现冲突,他们会交叉的接收到不属于自己的数据。但程序却认

为是正常的。我们应该怎样设计多线程环境下的 PING 程序呢。

请做过的兄弟不吝赐教!!欢迎大家参与讨论,分数送上!!

...全文
127 52 打赏 收藏 转发到动态 举报
写回复
用AI写文章
52 条回复
切换为时间正序
请发表友善的回复…
发表回复
猛禽 2003-01-18
  • 打赏
  • 举报
回复
我目前的代码已经可以证明我的做法是正确的,每个线程只会收到自己发出的包的响应,已经解决你的包冲突问题,偶尔死锁是多线程实现的技术细节,这个只要给共享数据区加上CriticalSecion就可以解决,我没有时间去调试它,而且目前我也不需要这个功能,所以我不想再花太多的精力在这上面,这应该是你自己完成的部分,你不可能要求别人什么都帮你做了。
cuptbluesky 2003-01-18
  • 打赏
  • 举报
回复
gz
lining_cumt985 2003-01-17
  • 打赏
  • 举报
回复
关注.
yqn123 2003-01-16
  • 打赏
  • 举报
回复
up
CCED136 2003-01-16
  • 打赏
  • 举报
回复
2: Raptor(猛禽)

你所说的这个问题,正是我们这次需要讨论的东西,也就是我在顶楼提出的问题。

我们现在要找到一种方法,只要能够解决这个问题,我们就可以结贴了。我想,我

不会在接收和发送数据包上出现错误,我要做的就是解决多线程环境下的冲突问

题。其实你的思路还是很好,只不过没有坚持的把它(解决该问题的代码或理论)

彻底的解决。而我要做的,我正在做的就是把这个问题彻底解决。

2: ALL

大家在讨论讨论,看还有没有更好的思路或者是方法。欢迎 UP

猛禽 2003-01-15
  • 打赏
  • 举报
回复
因为ICMP没有端口,所以收到的包很可能不是同一线程发出的。
但TCP/UDP因为有端口作区别,所以不会有这种问题。
虽然你是按“发包->接收->发包”的顺序,但因为对方响应时间的关系,收到的顺序是不一定的,所以很容易发生收到别人的包的情况
CCED136 2003-01-15
  • 打赏
  • 举报
回复
实在不好意思,我现在也是写的测试代码,代码非常凌乱。真的不好意思

拿出来见光。等兄弟解决了的时候,一定贴上来。最差也找个 FTP 让大家

共享一下代码。:)

我尽量把遇到的问题描述清楚,让大家出出主意。


对了,不知道楼上的兄弟发送和接收是怎么安排的。我现在是先发一个包,然后

立即调用接收,然后再发包,使用的是 “发包->接收->发包”的循环。但就是

这样子产生了问题。我再改改。

继续讨论!!!
Friecin 2003-01-15
  • 打赏
  • 举报
回复
听楼主说起来,这好像就不是线程间的安全问题了,而且在进程间也不安全?

虽然没有试验过,但我认为只要同时Ping的不是一个IP,就应该不会打假。且根据线程的理论来说,多线程并非真正意义上的同步。

如果楼主方便的话,把代码贴出来看看如何?

强烈关注!
猛禽 2003-01-15
  • 打赏
  • 举报
回复
如果每个线程PING不同的地址,那只要的收到包时判断是哪个地址的响应,再到共享数据区设置此地址有效即可。
如果存在不同线程PING同一地址的情况,就要在发送的数据包里加上线程的ID,在收到包时判断是哪个线程的响应。
因为共享数据方式的实现我没有再做,所以没法贴代码(原来那个只做到用ID区分,会有死锁的情况,因为证明是可行的,我就没再往下做,所以就不把这个有问题的贴出来了^_^)
penu 2003-01-15
  • 打赏
  • 举报
回复
问题在哪?关注中……
CCED136 2003-01-15
  • 打赏
  • 举报
回复
哎呀,真 TMD ,按我上面的方法,就算使用了共享内存都还有问题,

TNND ,就不信搞不定你!!!!开工!!
halibut 2003-01-15
  • 打赏
  • 举报
回复
学习!UP!
zihan 2003-01-15
  • 打赏
  • 举报
回复
to 猛禽
你可以说具体一点吗
怎样实现id和地址区别??是线程的id和什么的地址??
麻烦你写出来,好吗,谢谢
zihan 2003-01-15
  • 打赏
  • 举报
回复
好的,谢谢各位大虾,我试一试
CCED136 2003-01-14
  • 打赏
  • 举报
回复
要使用 线程ID 这是肯定的,因为我们要在接收到 ICMP数据包时判断该数据包

是否属于自己这个线程的。
NowCan 2003-01-14
  • 打赏
  • 举报
回复
Indy的icmp我没用过,不知道。
其实完全可以自己写的,不难。
猛禽 2003-01-13
  • 打赏
  • 举报
回复
to子寒

你用ID或地址区别一下就不会有这种事了
zihan 2003-01-12
  • 打赏
  • 举报
回复
NowScan 如果用indy的那个icmp怎样才能够得到他的id呢?
zihan 2003-01-12
  • 打赏
  • 举报
回复
我今天也试了,好像不是被丢弃,而是只有这些线程中的任何一个线程收到了这个数据包,所有的线程都会得到这个数据包,导致我ping的时候做所有线程中的任何一个收到消息,所有的线程都认为收到了,把本来该超时的线程也认为没有超时!
这是怎么回事?好像跟你们说的完全不一样啊

还有上面的那个说的那种方法可能是可以,可是好像这样要降低线程的速度,也降低了线程的优势
猛禽 2003-01-11
  • 打赏
  • 举报
回复
已经基本实现了.^_^
思路是在发的ICMP包中加入ThreadID(如果每个线程PING不同的地址就不用了,直接用地址区别就好了),接收时先用MSG_PEEK看看是不是自己要的,否则等待其它进程/线程接收,如果是才真正收下来处理。
用是可以,但会有一个问题:就是有一些线程发了多个包,但只收到一个对的请求就终止了,其它的响应包堆积的SOCKET的缓冲区里,把其它线程给塞住了。:<
看来还要加一个全局的数据区来记录已经结束的线程,以清除这些垃圾响应。太麻烦,我就不再做了。^_^
加载更多回复(32)

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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