Delphi2010的TIdUDPClient和TIdUDPServer问题

a215107822 2015-01-15 11:03:35
目前发送和接收都写好了,并且能正常发送和接收中文,英文,数字,符号, 但是遇到个别其他语种时,就会是乱码,不过大概知道是哪里问题了,就是不清楚怎么解决,请大神看下,先贴代码:


主要原因是因为枚举类型的msg: string[30] 导致发送的时候,如果发送以下语种,就会直接变成????,但是我这里,如果把后面的[30]去掉,自己能正常给自己发送,但是如果是发给远程机器的话,就会包内存地址错误,对这块没有研究,请大神帮忙看下,谢谢!


波斯语:شروع بی‌صدا
阿姆哈拉语:ማጫወት ጀምር
阿拉伯语:ترجيع سريع"

定义一个枚举类型

type
TSendrec = packed record
msg: string[30];
//msg: string[1024];
end;


发送端的代码

procedure TForm2.Button1Click(Sender: TObject);
var
Sendrec: TSendrec;
buffer:array [0..2048] of Char;
begin
Sendrec.msg := Edit2.Text;
CopyMemory(@buffer, @Sendrec, SizeOf(Sendrec));
IdUDPClient.SendBuffer(Edit1.Text, 5930, RawToBytes(buffer, sizeof(buffer)));
Memo1.Lines.Add('My -> ' + Edit1.Text + ': ' + Sendrec.msg)
end;


接收端的代码

procedure TForm2.IdUDPServerUDPRead(AThread: TIdUDPListenerThread;
AData: TBytes; ABinding: TIdSocketHandle);
var
Sendrec: TSendrec;
buffer:array [0..2048]of Char;
begin
BytesToRaw(AData, buffer, SizeOf(buffer));
CopyMemory(@Sendrec, @buffer, SizeOf(Sendrec));
Memo1.Lines.Add(ABinding.IP + ' -> My: ' + Sendrec.msg);
end;
...全文
759 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathletboy 2015-01-19
  • 打赏
  • 举报
回复
引用 12 楼 a215107822 的回复:
[quote=引用 11 楼 pathletboy 的回复:]
CopyMemory(@Sendrec.msg[0], @buffer, Length(Sendrec.msg));
CopyMemory那行改成这样
搞定了,最后没用这种方式,看了下一个帖子,使用了String => TBytes 直接转的方法,很简单的实现了 - -! 不过还是谢谢哈。 [/quote] 解决了就好,不过delphi的静态数组和动态数组取地址,是一个知识点,可以看下我之前总结的文章。 http://pb.itsong.com/2009/01/delphi_is_an_array_of_array_name_is_the_first_address.html
a215107822 2015-01-19
  • 打赏
  • 举报
回复
引用 11 楼 pathletboy 的回复:
CopyMemory(@Sendrec.msg[0], @buffer, Length(Sendrec.msg));
CopyMemory那行改成这样
搞定了,最后没用这种方式,看了下一个帖子,使用了String => TBytes 直接转的方法,很简单的实现了 - -! 不过还是谢谢哈。
a215107822 2015-01-16
  • 打赏
  • 举报
回复
请高手帮忙看下,我改成

type    
  TSendrec = packed record      
    msg: Array of Char;      
end; 
可以正常发送,但是接收的时候,就会报错,不清楚具体应该怎么写
pathletboy 2015-01-16
  • 打赏
  • 举报
回复
CopyMemory(@Sendrec.msg[0], @buffer, Length(Sendrec.msg));
CopyMemory那行改成这样
a215107822 2015-01-16
  • 打赏
  • 举报
回复
之前发的代码错了,是从0开始循环,我昨天改过的,但是接收到的数据为空。 for I := 0 to Length(Sendrec.msg) - 1 do 断点看了下Sendrec.msg数据,全部是#0
a215107822 2015-01-16
  • 打赏
  • 举报
回复
在CopyMemory之后,msg就变成空了,之后对他进行循环读取,就报错了
a215107822 2015-01-16
  • 打赏
  • 举报
回复
引用 7 楼 pathletboy 的回复:
你分配多少空间就接收多少,这次收不完下次再收。你报错的原因应该是你传参数不对。你贴出你的代码,看看你怎么传缓冲区参数的。

procedure TForm2.IdUDPServerUDPRead(AThread: TIdUDPListenerThread;
  AData: TBytes; ABinding: TIdSocketHandle);
var
    Sendrec: TSendrec;
    buffer:array [0..2048] of Char;
    str:string;
    i:integer;
begin
  SetLength(Sendrec.msg, SizeOf(buffer));
  BytesToRaw(AData, buffer, SizeOf(buffer));
  CopyMemory(@Sendrec, @buffer, SizeOf(Sendrec));
  for I := 1 to Length(Sendrec.msg) do
  begin
    str := str + Sendrec.msg[i];
  end;

  Memo1.Lines.Add(ABinding.IP + ' -> My: ' + str);
end;
pathletboy 2015-01-16
  • 打赏
  • 举报
回复
引用 6 楼 a215107822 的回复:
[quote=引用 5 楼 pathletboy 的回复:] [quote=引用 4 楼 a215107822 的回复:] 请高手帮忙看下,我改成

type    
  TSendrec = packed record      
    msg: Array of Char;      
end; 
可以正常发送,但是接收的时候,就会报错,不清楚具体应该怎么写
动态数组用之前要先用SetLength分配内存空间。[/quote] 是的,我Setlength了,发送过去可以,但是接收的时候,不清楚应该set多少, 我setLength(Sendrec.msg, SizeOf(buffer))任然报错[/quote] 你分配多少空间就接收多少,这次收不完下次再收。你报错的原因应该是你传参数不对。你贴出你的代码,看看你怎么传缓冲区参数的。
a215107822 2015-01-16
  • 打赏
  • 举报
回复
引用 5 楼 pathletboy 的回复:
[quote=引用 4 楼 a215107822 的回复:] 请高手帮忙看下,我改成

type    
  TSendrec = packed record      
    msg: Array of Char;      
end; 
可以正常发送,但是接收的时候,就会报错,不清楚具体应该怎么写
动态数组用之前要先用SetLength分配内存空间。[/quote] 是的,我Setlength了,发送过去可以,但是接收的时候,不清楚应该set多少, 我setLength(Sendrec.msg, SizeOf(buffer))任然报错
pathletboy 2015-01-16
  • 打赏
  • 举报
回复
引用 4 楼 a215107822 的回复:
请高手帮忙看下,我改成

type    
  TSendrec = packed record      
    msg: Array of Char;      
end; 
可以正常发送,但是接收的时候,就会报错,不清楚具体应该怎么写
动态数组用之前要先用SetLength分配内存空间。
a215107822 2015-01-15
  • 打赏
  • 举报
回复
引用 1 楼 luxuewei5214 的回复:
多语言确实比较麻烦,是不是因为buffer:array [0..2048] of Char;中这个char类型的问题呢?delphi2010中的string默认好像是widestring类型的,应该是支持unicode的,这个Char就不清楚了
对,因为多语种,所以原来是Delphi7的程序,花了好长时间,才把这个改变成Delphi2010的,Char在2010里面是WideChar 主要目前是发送的时候,已经是????? 所以接收到也变成了??? 就因为String[30]但是我去掉[30]又报错。。 这代码页是拷贝别人的,自己对这块不大了解
luxuewei5214 2015-01-15
  • 打赏
  • 举报
回复
多语言确实比较麻烦,是不是因为buffer:array [0..2048] of Char;中这个char类型的问题呢?delphi2010中的string默认好像是widestring类型的,应该是支持unicode的,这个Char就不清楚了
ckxpnn 2015-01-15
  • 打赏
  • 举报
回复
不要在这里问问题了,都没人回答的

1,593

社区成员

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

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