关于UDP通讯中如何响应是否收到一方发的数据包 ( 积分: 50 )

  • 主题发起人 主题发起人 cjsam
  • 开始时间 开始时间
C

cjsam

Unregistered / Unconfirmed
GUEST, unregistred user!
我用INDY控件包做一个UDPserver服务器。
主要这样实现的:
有个IDUdpServer,IDUdpClient,2个控件,IDUdpServer监听某个固定端口。收到client1发来的一个UDP数据包,就新建一个线程来处理这个udp,
在处理过程中,把这个udp解析完成后,需要向client2发送一个数据包过去,在当前线程中就调用IDUdpClient发送一个报文给client2客户端。client2如果收到后,它会发个响应过来,但是它的响应,不是从收到的udp包里直接提取IP,PORT来给的响应,它的响应是直接响应到IDUdpServer上去。
现在我需要判断是否我发给client2的udp有没有发送成功,等待3分钟,如果没有成功,我要重发。但是目前的问题是,我在等待client2的udp有没有发送成功的过程是,还在先前创建的哪个线程里等待,那个线程还没结束。而client2给的响应却发送到IDUdpServer这个控件里去了,请问大家有什么好的办法来解决这个问题吗?
 
你设置一个标志变量不就可以啊,如果IDUdpServer收到client2的响应,你设置flag=true,在发送数据到client2的线程进行这个变量测试,如果flag=true,说明已经响应,如果flag=false ,计算时间看是否超时。
 
你的问题讲的有点难以理解,我费了好大劲看懂了,汗!你说的“那个线程还没结束。而client2给的响应却发送到IDUdpServer这个控件里去了”,给你个建议,在UDPserver收到client1的报文后,等第一个线程处理完毕了再向client2发送数据包,我不知道你是否是这样做的,这样发送完毕第一个线程就可以结束。而至于如何在UDPserver中判断到底是client1发来的数据包还是client2发来的响应数据包,你可以这样,定义一个报文结构,用一个固定字符分割(比如“|”),分割的各个部分代表不同数据,你指定一个部分为“数据包类型”段,这个段中的不同值代表了接收到的数据包的不同类型,那样,client1发来的数据包为“类型1”,client2发来的响应数据包为“类型2”,这样用同一个UDPserver就可以判断了,也不需要哪个线程等待了。
 
我发现这个问题的根源就是,用IDUdpServer收数据的这个线程向另一个线程通讯,告诉另一个给client2发UDP包的线程,我收到了client2的回复了,不用再等到重发了。
这个需要怎样做呢?

to 壁画,你说的这个意思是这个,不过不可能这样实现的,是不同线程间的通讯。
to antonytyler,我表达能力一般,看来你还是没明白我说的。呵呵
有谁知道吗?
 
我说的就是这个意思。
 
后退
顶部