放2个TIdUDPServer
procedure TForm1.FormCreate(Sender: TObject);
begin
IdUDPServer1.DefaultPort:= 9000;
IdUDPServer1.Active:= True;
IdUDPServer2.DefaultPort:= 5000;
IdUDPServer2.Active:= True;
end;
定义数据包。不知道这样定义是不是会有问题。如果需要把string定长。那发送超过这个长度的字符串怎么做。
type
TTestPackage = packed record
Head: cardinal;
Body: string;
end;
//发送
procedure TForm1.Button1Click(Sender: TObject);
var
TP: TTestPackage;
p: Pointer;
nSize: cardinal;
begin
TP.Head:= Length(Edit1.Text);
TP.Body:= Edit1.Text;
nSize:= SizeOf(TP.Head) + Length(TP.Body);
GetMem(p, nSize);
CopyMemory(P, @TP.Head, SizeOf(TP.Head));
CopyMemory(Pointer(Longint(P)+SizeOf(TP.Head)), Pointer(TP.Body), Length(TP.Body));
IdUDPServer1.SendBuffer('127.0.0.1', 5000, P, nSize);
FreeMem(p, nSize);
end;
procedure TForm1.IdUDPServer2UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
s: string;
L: cardinal;
begin
AData.Read(L, SizeOf(L));//读取长度就不对了。
SetLength(s, L);
AData.Read(s[1], L);
edit2.Text:= s;
end;
我的想法是给不定长的字符串头部加上他的长度。接收的时候先读取长度,再读取内容。
我记得以前用ServerSocket和ClientSocket做过是可行的。不知道为什么上面的代码不成。请教高手解答下。
Pointer换成MemoryStream试了下也不行
ms:= TMemoryStream.Create;
ms.Write(TP.Head, SizeOf(TP.Head));
ms.Write(Pointer(TP.Body)^, Length(TP.Body));
IdUDPServer1.SendBuffer('127.0.0.1', 5000, Pointer(ms.Memory)^, ms.Size);
ms.Free;
已经解决了。。。
找了半天发现程序里在写入一个常量的时候用了
ms.Write(Pointer(CONST_HEAD_LONG_MESSAGE)^, SizeOf(Integer));
换成就正常了
H:= CONST_HEAD_LONG_MESSAGE;
ms.Write(H, SizeOf(Integer));
gx
--------------------------
新闻:
上海最快3月底推TD上网本导航:
博客园首页 知识库 新闻 招聘 社区 小组 博问 网摘 找找看
阅读(879) | 评论(0) | 转发(0) |