我的情况是这样的。
结构:
type
    mail = record
    mailname:string;
    mailid:string;
end;
数组:
mailrd:array[0..100] of mail;要把整个mailrd数组都传过去。

解决方案 »

  1.   

    不能是string,用string[255],如果超过255,用array [0..300] of char;
    string用起来很方便,不过它可以说只是一个指针,所以sendbuf不能确定它有多少个字节要发( sizeof(string) = 4 )type
      mail = record
        mailname: string[255];
        mailid: string[255];
      end;mailrd:array[0..100] of mail;// init mailrd ..
    socket.sendbuf(mailrd, sizeof(mailrd));client:
    var
      Data: array [0..100] of mail;
      len: Integer;
    begin
      len := Socket.ReciveLength();
      if Len = SizeOf(Data) then
      begin
        FillChar(Data, SizeOf(Data));  //初始化一下好
        Socket.RecvBuf(Data, Len);
      end else
        raise Exception.Create('我不知道怎么接收其它数据');
    end;
      

  2.   

    楼上兄弟,你if Len = SizeOf(Data) then一直不用相等的。所以我就改写为如下。
    为什么传输数据用不完整。结果显示只有前15条数据。是什么原因呢。
    用不用是缓存的设置,如是。又在哪里设置呢?
    我的测试代码是://client:
    procedure TForm1.ClientSocket1Read(Sender: TObject;
      Socket: TCustomWinSocket);
      var i:integer;
    begin
        i:=0;
      len := Socket.ReceiveLength;
      Socket.ReceiveBuf(mailrd, len);
      while mailrd[i].mailid<>'' do
      begin
        listbox1.Items.add(mailrd[i].mailid);
        listbox1.Items.add(mailrd[i].mailname);
        i := i+1;
      end;
    end;//server:
    写入测试数据到数组
    procedure TForm1.Button3Click(Sender: TObject);
    var
        i:integer;
    begin
        for i:=0 to 20 do
        begin
            mailrd[i].mailname :='mail'+inttostr(i);
            mailrd[i].mailid :=inttostr(i);
        end;
        for i:=0 to 20 do
        begin
            showmessage(mailrd[i].mailname + '  ' + mailrd[i].mailid);
        end;
    end;
    //发送
    procedure TForm1.Button2Click(Sender: TObject);
    begin
       Serversocket1.Socket.Connections[0].SendBuf(mailrd,sizeof(mailrd));
    end;
      

  3.   

    *******************
    unit Unit2;interfacetype
      PMailData = ^TMailData;
      TMailData = packed record
        ID: string[20];
        Name: string[20];
      end;implementationend.procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
      Socket: TCustomWinSocket;
      Data: array [0..100] of TMailData;
    begin
      if ServerSocket1.Socket.ActiveConnections <= 0 then Exit;
      FillChar(Data, SizeOf(Data), 0);
      for I := 0 to 100 do
      begin
        Data[I].ID := 'ID' + IntToStr(I);
        Data[I].Name := 'Name' + IntToStr(I);
      end;
      Socket := Serversocket1.Socket.Connections[0];
      Socket.SendBuf(Data, SizeOf(Data));
      Memo1.Lines.Add('Send Data to: ' + Socket.RemoteHost);
    end;procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      Memo1.Lines.Add(Format('%s connect server', [Socket.RemoteHost]));
    end;******************************
    Client:procedure TForm3.ClientSocket1Read(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      I, Len: Integer;
      Data: array [0..100] of TMailData;
    begin
      FillChar(Data, SizeOf(Data), 0);
      Len := Socket.ReceiveLength;
      //有可能数据超过8k,Socket默认传输的一次单位的字节数是8k,如超过那么
      //Socket.ReceiveLength总是8k,所以收数据时,还是Len = SizeOf(Data)看看
      //我的TMailData设的比较小,所以没事,如果你把设成string[200],程序会错
      if Len = SizeOf(Data) then
      begin
        FillChar(Data, SizeOf(Data), 0);  //初始化一下好
        Socket.ReceiveBuf(Data, SizeOf(Data));
        for I := 0 to 100 do
        begin
          memo1.Lines.Add(Data[I].ID);
          memo1.Lines.Add(Data[I].Name);
        end;
      end else
        raise Exception.CreateFmt('我不知道怎么接收其它数据, Len: %d, SizeOf: %d', [Len, SizeOf(Data)]);
    end;end.
      

  4.   

    说个思路。。自定义一个协议:
                       分隔符$0       结束标志
    $DDDDD    [3]   100 $0 101 $0 102 $0
     报头   数组下标 具体数据我就是这么做的。实现功能。完美。。呵呵 
      

  5.   

    还有问题呀,要在客户端实现选发一条是否准备接收信息。
    1)如果服务器准备好就发送数据。(问题一:可不可以解决指令放在接收文本中。数据放在socket.data中,如可以说说小例)。
    2)如果超时中断发送。(问题二,如何判断超时呢。除了延时。clientsocket有没有此功能)
    3)一对多(服务器对多台客户)的方式记录客户数组,数组下标一定能够完成connections[i]中的i的数据发送吗?(问题三,如不是还有什么好的方法呢。只限服务器操作)
    4)经过一段的socket开发,发现我的程序有这样一个问题(问题四,服务器只监听并做接收指令并根据指令返回结果。当客户端发送指令时,经常不会有返回结果。好象就是单方通信。怎样做会稳定,可靠呢??)