udp通讯接收不到数据

hyarcher25 2016-09-30 10:13:14
http://www.cnblogs.com/keyvip/archive/2010/11/16/1878713.html用的这个大神的代码
我用的delphi xe7
接收端接收不到数据,用网上其它的网络调试工具可以接收到数据
procedure TForm1.idpsrvr1UDPRead(AThread: TIdUDPListenerThread;
const AData: TStream; ABinding: TIdSocketHandle);
var Comm:TCommBlock;
begin
AData.ReadBuffer(Comm,SizeOf(Comm));
mmo1.Lines.Add('Comm');
end;
是不是这个函数有问题?初学,请大神指点。谢谢
...全文
2019 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sazhufa 2016-10-11
  • 打赏
  • 举报
回复
引用 5 楼 hyarcher25 的回复:
[quote=引用 4 楼 sazhufa 的回复:] idpsrvr1 这个控件需要在初始化,一般是指定端口和本机的IP地址(或者0.0.0.0为所有地址),然后激活这个控件。 (以上也可以在设计期用属性编辑器完成) 程序运行后, 新开另一个cmd窗口,运行netstat -na -p udp -o 可以看到所有进程的UDP端口监听情况,正常情况下,你的程序应该在列表中(PID需要在任务管理器中查进程名) 这时如果没有其它安全软件和防火墙的干扰,肯定可以收到udp数据包的。(可以程序中做调试断点) 另外,代码写法上不严谨,应该按照接收到的AData的长度来读数据,而不是自定义的数据结构大小(万一收到的包没有那么大呢?) 如果考虑分包(udp是无序的),还应该考虑udp包中定义序号的问题,然后程序重新组合。
////////////////////////////////////////////////////// procedure TForm1.btn1Click(Sender: TObject); begin idpsrvr1.DefaultPort := StrToInt(lbledt1.Text); idpsrvr1.Active := True; btn1.Enabled:=False; btn2.Enabled:=True; end; ////////////////////////////////////////////////////// procedure TForm1.btn2Click(Sender: TObject); begin idpsrvr1.Active := False; btn2.Enabled:=False; btn1.Enabled:=True; end; ////////////////////////////////////////////////////// procedure TForm1.btn3Click(Sender: TObject); begin mmo1.Clear; end; ////////////////////////////////////////////////////// procedure TForm1.idpsrvr1UDPRead(AThread: TIdUDPListenerThread; const AData: TStream; ABinding: TIdSocketHandle); var Comm:TCommBlock; begin AData.ReadBuffer(Comm,AData.Size); mmo1.Lines.Add('Comm'); end; ////////////////////////////////////////////////////// 三个按钮,一个开始接收,一个关闭接收,一个清空接收数据。 请问idpsrvr1这个控件如何初始化呢?[/quote] idpsrvr1.Active := True; 这个就是初始化了 我原帖中提到程序启动后,用netstat 来验证,验证结果是怎样?
hongss 2016-10-10
  • 打赏
  • 举报
回复
前一段也碰到这个问题,后来用别的控件解决了。。。
hyarcher25 2016-10-10
  • 打赏
  • 举报
回复
引用 4 楼 sazhufa 的回复:
idpsrvr1 这个控件需要在初始化,一般是指定端口和本机的IP地址(或者0.0.0.0为所有地址),然后激活这个控件。 (以上也可以在设计期用属性编辑器完成) 程序运行后, 新开另一个cmd窗口,运行netstat -na -p udp -o 可以看到所有进程的UDP端口监听情况,正常情况下,你的程序应该在列表中(PID需要在任务管理器中查进程名) 这时如果没有其它安全软件和防火墙的干扰,肯定可以收到udp数据包的。(可以程序中做调试断点) 另外,代码写法上不严谨,应该按照接收到的AData的长度来读数据,而不是自定义的数据结构大小(万一收到的包没有那么大呢?) 如果考虑分包(udp是无序的),还应该考虑udp包中定义序号的问题,然后程序重新组合。
////////////////////////////////////////////////////// procedure TForm1.btn1Click(Sender: TObject); begin idpsrvr1.DefaultPort := StrToInt(lbledt1.Text); idpsrvr1.Active := True; btn1.Enabled:=False; btn2.Enabled:=True; end; ////////////////////////////////////////////////////// procedure TForm1.btn2Click(Sender: TObject); begin idpsrvr1.Active := False; btn2.Enabled:=False; btn1.Enabled:=True; end; ////////////////////////////////////////////////////// procedure TForm1.btn3Click(Sender: TObject); begin mmo1.Clear; end; ////////////////////////////////////////////////////// procedure TForm1.idpsrvr1UDPRead(AThread: TIdUDPListenerThread; const AData: TStream; ABinding: TIdSocketHandle); var Comm:TCommBlock; begin AData.ReadBuffer(Comm,AData.Size); mmo1.Lines.Add('Comm'); end; ////////////////////////////////////////////////////// 三个按钮,一个开始接收,一个关闭接收,一个清空接收数据。 请问idpsrvr1这个控件如何初始化呢?
hyarcher25 2016-10-10
  • 打赏
  • 举报
回复
引用 1 楼 learning8899 的回复:
防火墙没有屏蔽吧?
没有哦
hyarcher25 2016-10-10
  • 打赏
  • 举报
回复
引用 6 楼 hongss 的回复:
前一段也碰到这个问题,后来用别的控件解决了。。。
哪个哪个?
sazhufa 2016-10-08
  • 打赏
  • 举报
回复
idpsrvr1 这个控件需要在初始化,一般是指定端口和本机的IP地址(或者0.0.0.0为所有地址),然后激活这个控件。 (以上也可以在设计期用属性编辑器完成) 程序运行后, 新开另一个cmd窗口,运行netstat -na -p udp -o 可以看到所有进程的UDP端口监听情况,正常情况下,你的程序应该在列表中(PID需要在任务管理器中查进程名) 这时如果没有其它安全软件和防火墙的干扰,肯定可以收到udp数据包的。(可以程序中做调试断点) 另外,代码写法上不严谨,应该按照接收到的AData的长度来读数据,而不是自定义的数据结构大小(万一收到的包没有那么大呢?) 如果考虑分包(udp是无序的),还应该考虑udp包中定义序号的问题,然后程序重新组合。
tanqth 2016-10-02
  • 打赏
  • 举报
回复
引用 2 楼 tanqth 的回复:
商品呀、防火墙呀,需要查找的地方还是挺多的。就一段代码,看不出问题。
写错了,是“端口”
tanqth 2016-10-02
  • 打赏
  • 举报
回复
商品呀、防火墙呀,需要查找的地方还是挺多的。就一段代码,看不出问题。
learning8899 2016-09-30
  • 打赏
  • 举报
回复
防火墙没有屏蔽吧?

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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