作UDP报文接收程序的问题,请高手指点!

gunnxue 2003-06-16 11:28:28
初次作UDP报文接收程序,请指点迷津!发送方为UNIX,接受方W2000P
1、用NMUDP控件有什么限制吗?好象PACKET大于1024B就不能正确收包,提示包长度为0?
2、改用 win soket:
var:
a,sock:integer;
myadd:tsockaddrin;
remote:tsockaddr;
....
sock:=winsock.socket(AF_INET,SOCK_DGRAM,0);
myadd.sa_family:=AF_INET;
myadd.sin_addr.S_addr:=INADDR_ANY;
myadd.sin_port:=htons(1001);
a:=bind(sock,myadd,sizeof(myadd));
....
len:=sizeof(remote);
num:=recvfrom(sock,buff,10000,0,remote,len);
....
可以正确收包了,但运行后界面不再响应任何操作,无法退出,只能从任务管理器中强行关闭,应如何解决?
3、报文的字节顺序问题,我弄不明白主机字节顺序和网络字节顺序的含义,应如何操作,有什么好方法吗?
1)假设 count=3,buffer中为float型,4字节
f_add:^single;
fadd:single;
mc:array[0..3]of char;
...
for j:=0 to 3 do
mc[j]:=buff[count-j]; //高低字节交换
f_add:=@mc;
fadd:=f_add^;
datatype:=format('%f',[fadd]);
可得到正确数据,若字节顺序不交换,则出错
2)buff的4、5字节存放数据为short型,2字节
numb:integer;
datatype:string;
...
numb:=byte(buff[4]);
datatype:=Format('%x', [numb]);
numb:=byte(buff[5]);
datatype:='$'+datatype+Format('%x', [numb]);
numb:=strtoint(datatype);
这里没有进行高低字节的转换,但仍得到正确数据,若交换则出错


...全文
36 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
DelphiBoy2003 2003-06-16
  • 打赏
  • 举报
回复
用Indy控件里面的IdUDP

1,594

社区成员

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

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