用nmudp控件接收数据(字符串)时,字符串被"0"截断,请问高手如何解决?

wangdajunxx 2005-11-25 10:02:36
我用一个NMUDP控件接受服务器端发送来的报文,报文格式如下: 144 3 5 1 2 4 6 0 0 1 3 8 9 9 4 3
都是数字,但是到"6"的时候字符就被截断了,并且NumberBytes显示只是收到了7个字节,我按ReadBuffer的方法接收还是如此,DELPHI 中的字符串是以"#0"来结束的,但是报文全接收过来以后再处理也可以,但是NMUDP控件压根就没有完全接受过来,在它那里就给我截断了,这可怎么办呀,UDP协议的控件大家还有更好的吗?请各位高手帮忙解决呀!

procedure TFmain.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
Mystream: TMemoryStream;
tmpstr: ansistring;
begin
Mystream:=TMemoryStream.Create;
try
nmudp1.ReadStream(Mystream);
Setlength(tmpstr,NumberBytes);
MyStream.Read(Tmpstr[1],NumberBytes);
Memo1.Lines.Add('IP地址为:'+fromip+
' 字节个数为:'+inttostr(NumberBytes)+
' 详细内容为:'+TmpStr);
finally
MyStream.Free;
end;
end;
...全文
270 点赞 收藏 17
写回复
17 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wangdajunxx 2005-12-02
我用NMUDP如此,IDUDPClient如此,用vb下面的WinSock也是如此,换了好几台机器也是如此!晕!!!!!!!!!!!!!!!!!!!!我要死了!!!!!!!!!!!!!!!!!!!!!!,
回复
clasj 2005-11-30
归根结底是NumberBytes害了你,可能这就是传说中这个控件的缺陷:)
用Stream.Size吧!
回复
wangdajunxx 2005-11-30
问题解决了,要用流读二进制数据才能全部显示出来,并且不要管NumberBytes这个该死的参数,妈的,高兴,散分!
回复
clasj 2005-11-30
Delphi\Demo\Indy\...
回复
wangdajunxx 2005-11-30
我用IDUDPClient控件试过了,接收的数据也是7位数字,当然也是被截断了,请问用IDUDPClient的时候申请内存怎么申请呀,最好有源代码.
回复
wangdajunxx 2005-11-30
谢谢keiy,我申请内存试一下吧,但是NMUDP1DataReceived这个事件发生时NumberBytes显示的就是被截断以后的字符个数,难道要我到底层或是父类去更改他的属性吗?我还试过 144 3 5 0 3 0 1 4 7 ......(后几位省略掉了)这个数据,但是只是接收到"5"就被截断了,这时NMUDP1DataReceived事件的NumberBytes参数显示是3,很明显就是接收到了144 3 5,也是"0"后面的都被截断了.大家一起帮忙参考一下,到现在为止我发现我是第一个碰到这个问题的!
回复
clasj 2005-11-30
随便写了一个。
接收端:
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
Buffer: array of byte;
begin
SetLength(Buffer, AData.Size);
AData.ReadBuffer(Buffer, AData.Size);
Memo1.Lines.Add(inttostr(AData.Size));
end;

发送端:
var
Buffer: array[0..9] of byte = (1,0,2,0,3,0,4,0,5,0);

procedure TForm1.Button1Click(Sender: TObject);
begin
IdUDPClient1.SendBuffer('127.0.0.1', 1234, Buffer, sizeof(Buffer));
end;
回复
wangdajunxx 2005-11-30
发送端没有问题
回复
xuancaoer 2005-11-30
mark
回复
clasj 2005-11-30
估计是你发送的时候只发了前面7个字节吧,检查一下发送端。
回复
clasj 2005-11-30
I 服了 YOU,被你忽悠了:)
回复
wangdajunxx 2005-11-30
不对,还是没有解决,我用二进制读取的超过NumberBytes个数的字符才发现,前7位还是那几个数据,但是后面的数据还是没有出来,刚才看错了,继续急切期盼解决办法中!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
回复
wangdajunxx 2005-11-28
我是在DELPHI6下面开发的,怎么没有人理我呀?各位高手帮帮忙呀,问题解决马上散分,不够可以再加,十万火急呀!
回复
herman-chen 2005-11-28
晕,我也没用过,会有这样奇怪的问题呀.
建议用其它控件试试吧,也有可能是控件本身的问题
回复
柯本 2005-11-28
另外,你用pchar,必须用getmem申请内存,最后用freemem释放它
回复
柯本 2005-11-28
不要用ansistring,用pchar或array of char
你还可以直接用
NMUDP1.ReadBuffer
也用pchar或array of char
回复
clasj 2005-11-28
NMUDP控件这个控件没用过,因为听说不太好,你用Indy的控件吧,有Demo可以参考。
回复
发帖
网络通信/分布式开发
创建于2007-08-02

1575

社区成员

Delphi 网络通信/分布式开发
申请成为版主
帖子事件
创建了帖子
2005-11-25 10:02
社区公告
暂无公告