怎样在线程中使用IdUDPServer控件接收数据(在线等) ( 积分: 55 )

  • 主题发起人 主题发起人 tswhq
  • 开始时间 开始时间
T

tswhq

Unregistered / Unconfirmed
GUEST, unregistred user!
在发送数据时可在线程中来发送数据

但在数据接收时事件在主线程中,
procedure TForm1.IdUDPServerUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
begin

end;
这时我们需怎样写程序呢?
另由于udp不象tcp那样稳定,我们在发数据时会采用

发送方        接收方
第1步      第2步
已发送字节+数据--------------> 已接收字节 是否等于 刚收到的已发送字节
相等 不相等
重复第1步直到结束 <---------- 发送Next包<---第3步---->发送Error包

我看了好多程序都是这样写的,但是没有相关的机制来判断当第1步发送数据后,如
果网络发生异常,造成接受方未受到数据,这时就会出现双方都停止的现象,怎样才
能解决呢?(不会用时间控件去监控吧???) 
 
在发送数据时可在线程中来发送数据

但在数据接收时事件在主线程中,
procedure TForm1.IdUDPServerUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
begin

end;
这时我们需怎样写程序呢?
另由于udp不象tcp那样稳定,我们在发数据时会采用

发送方        接收方
第1步      第2步
已发送字节+数据--------------> 已接收字节 是否等于 刚收到的已发送字节
相等 不相等
重复第1步直到结束 <---------- 发送Next包<---第3步---->发送Error包

我看了好多程序都是这样写的,但是没有相关的机制来判断当第1步发送数据后,如
果网络发生异常,造成接受方未受到数据,这时就会出现双方都停止的现象,怎样才
能解决呢?(不会用时间控件去监控吧???) 
 
楼主自己都已经讲了:由于udp不象tcp那样稳定。
 
创建子线程的时候再创建IdUDPServer,IdUDPServer属于子线程,这样发收数据都在子线程里控制,将最终结果返回给主线程就可以了
 
http://www.projectindy.org/DemoDownloads/Indy9Demos_26Oct04.zip
 
发送的时候有一个发送错误事件,如果没发出去,则激活该事件;
至于发送到网上后能不能收到,我想单独写个反馈程序比较好;
 
to dongy_143
当没发送成功时,udp控件会激活哪些事件?
 
onreceiveerror明天帮你查查,今天下班了
 
怎么没有下文了?
我的问题正好和楼主的问题一样!
关注!
 
发送失败在send()的返回值就可以判断,但是,udp通常并不是send失败而是传输过程中丢失等,所以通常都是在send完后进行recv等待(可以使用WSAWaitForMultipleEvent())对方返回响应,超时(未收到对方返回的响应信息)的话就当作之前send的内容对方没有收到
 
事件插到一个队列
线程去读了
 
或者你把这个控件定义到线程里边
 
哈哈,我就是用定时器控制超时来判断连接中断的, UDP是非连接性的不可靠数据传输,好
像只有用发送完数据在设定时间内没有收到应答,并且连续超时超过设定的N次来判断是否
和对方的连接正常(特别是在internet上通讯的时候,由于路由和网络传输的延迟,只靠一次
的超时并不能比较可靠的判断当前连接是否真的中断,所以必须加上一个连续超时次数的计
数)
 
to DickWu
大概多长时间呀?听说nat,route超时后会关闭为udp开放的端口
 
idUDPServer是threaded的
 
为什么不用TCP?重发机制TCP已经实现了。
 
多长时间。这个要视你的网络速度和你发的数据包大小来看。
你先默认一秒。然后计算第一次数据发出到对方给你响应的时间。
将他加上几十毫秒作为下一次的等待时间.
一般情况内部网络都是 几毫秒到几十毫秒.外网的就是不好说。
但总是不会超过五秒还没响应的。超过就算断开了吧.
 
多人接受答案了。
 
后退
顶部