放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;

解决方案 »

  1.   

    我的想法是给不定长的字符串头部加上他的长度。接收的时候先读取长度,再读取内容。
    我记得以前用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;
      

  2.   

    已经解决了找了半天发现程序里在写入一个常量的时候用了
    ms.Write(Pointer(CONST_HEAD_LONG_MESSAGE)^, SizeOf(Integer));换成就正常了
    H:= CONST_HEAD_LONG_MESSAGE;
    ms.Write(H, SizeOf(Integer));