UDP 通讯,接收数据一段时间后,一条消息也收不到,望各位大侠告知原因,谢谢!(200分)

  • 主题发起人 主题发起人 eachbuilder
  • 开始时间 开始时间
试改成TmpStream.Write(UDPCommData[1], SizeOf(UDPCommData));看看!
TmpStream.Read(UDPCommData[1], NumberBytes);
 
可以用广播的方试,这样每台都可以收到呀~~~
 
因为目前有个项目需要用到UDP通讯,感谢无忌提供一个如此好的控件,不知道无忌兄可否把你的控件也给我发一份,最好有demo 。谢谢
maocx@eitop.com
 
我准备这几天就改进一下我的哪个东西,除掉几个BUG,做好了,写一个详细的
DEMO和说明给大家
 
http://new.playicq.com/dispdocnew.php?id=5055
是我新的版本,
 
源码空间 是要钱的,能否麻烦无忌兄给我发一份到我的信箱。谢谢
 
无忌大侠:
可不可以给我发一个:
singlecat@163.com
Thank u very much!
 
无忌大侠:
给我发一份
Webmaster@eachbuilder.com
Thank you!!
 
上面要代码的我都发了,
 
无忌大侠:
给我一份
lexecutor@sina.com
thanks!
 
我没有收到哦,能不能给我来一份啊。thanks

maocx@eitop.com
 
我也要,我也要阿,大侠给我一份
caibirdtoo@163.com
 
在维护在线用户上,我发现了一个问题,不知道各位发现没有
我使用的是 Indy 的一对 IdUDPServer 进行通信,服务器对所有在线用户循环传送语音数据
因为不知道如何检测客户机掉线,以至于现在的情况是
当在线用户存在某一无效的IP地址(即此IP没有运行客户端,可能是由于掉线引起,退出信号没有发送到服务器)
此时,服务器的 IdUDPServer 就再也不收接和发送数据了,以后的用户就无法连上服务器了
各位有何高见,请帮忙
 
原因很简单,TIdUDPServer每次发送一个包,他都要检测发送的IP是否存在,
如果发送IP不存在,本机会收到一个ICMP 远程IP不可到达的错误,所以Indy
长时间工作有可能出现一些问题,我自己做的哪个UDP控件没有哪个问题,我
不检测远程IP是否是不可到达,这个通过自己设置一个良好的协议去实现
 
没有用过,但id 口碑一直挺好的。

也没有看过TIdUDp的代码,但我想
“TIdUDPServer每次发送一个包,他都要检测发送的IP是否存在,
如果发送IP不存在,本机会收到一个ICMP 远程IP不可到达的错误”
值得斟酌。
发送UDP时,收到ICMP不可达的错误一定是出现在跨网段上,当UDP
报文经路由到达指定网段时,路由器发现指定的目的IP不存在,于是
给发送端一个ICMP不可达的错误。如果发送IP和接收IP在同一网段,
而接收IP又不存在,那么本地网关也有可能给发送方一个不可达的错
误,这个,好像是没有标准,可给可不给,可作一下试验。

回到刚才那句话,TidUDPServer如何检测对方的 IP 是否存在?而且,
本机收到 ICMP 不可达,TidUDPServer应该是感受不到的,TidUDPServer
肯定是在socket层上,ICMP报文它如何接收
 
检测是否存在IP很容易,用GetHostByAddr()
你如果用Indy的TIdUDPServer想一个不村在的IP发数据包是有异常跳出来的,不信你
就试试。
 
是我没有说清楚.
如果对方ip不存在,udp的sendto函数就会返回错误,但该错误
大部分情况不会源于收到的 ICMP 不可达错误.
只有跨网段的情况,当本机ip层收到socket层要向其他网段的机
器发包时,它按照路由交到目的网段的路由器上,该路由器发现
本网段没有目的机,才会给本机一个不可达错误。不管你用什么
函数(包括 GetHostByAddr),都是这种情况。

另外,你注意过 TidUdpServer 是在什么地方抛的异常吗? 我想
应该就是Sendto返回错误吧。 多交流 。 :)
 
相同情况下,我用我的自己的UDP控件发送数据到一个不存在的IP是不会有错误的,
而这个时候INDY是有异常,显然这个是他检测发送IP是否存在造成的,我跟踪过
是INDY用函数检查IP是否存在产生的。
 
请问楼上两位,能否使用此异常检测远程IP是否在线
我目前使用张兄的UDP控件,解决了维护在线IP列表的问题
如果INDY UDP的这个特点不能加以利用,我认为还是张兄的控件好用
 
无忌兄,可否给我一份? zengtaovip@vip.sina.com
 
后退
顶部