我用socket发送记录类型可是收到的数据是乱码,为何?
PTReadSocketData = ^ReadSocketData
TReadSocketData = record
  I: Integer;
  S: string;
end;------------------------------------
这是发送部分
begin
  New(ReadSocketData);
  ReadSocketData.S := 'qwertyqwert';
  ReadSocketData.I := 2134567;
  ClientSocket1.Socket.SendBuf(ReadSocketData, 1024);
  Dispose(ReadSocketData);
end;------------------------------------
这是接收部分
var
  PKTLen: Integer;
begin
  New(ReadSocketData);
  repeat
    PKTLen := recv(NS, ReadSocketData, 1024, 0);
    WriteLn(ReadSocketData^.S);
    WriteLn(IntToStr(ReadSocketData^.I));
  until PKTLen < 1;
  Dispose(ReadSocketData);
end;
  大家看看为什么接收到的数据不对!我是百思而不得其解.

解决方案 »

  1.   

    record里的string类型的大小不定!定义为: s: string[50];试试?
      

  2.   

    我现在全部定义成以下格式了:
      TWriteSocketData = record
        Password: array[0..9] of Char;
        CommandID: array[0..9] of Char;
        CommandParamstr: array[0..30] of Char;
        I: Integer;
        B: Byte;
    //    SocketID: TSocket;
        MessageStr: array[0..9] of Char;
        FilePath: array[0..9] of Char;
        StrList: TList;
    //    DataBlockBuf: array[0..4095] of Byte;
      end;
    我想把以下的格式:
      TFileInfo = record
        FileName: array[0..9] of Char;
        FileAttr: array[0..9] of Char;
        FileSize: Integer;
        FileDate: array[0..30] of Char;
      end;
    放在一个TStringsList里面,然后用SendBuf来发出去,但是不行.看看大家有没有好的办法没有.
      

  3.   

    楼上的说用Byte数组,那应该是一个什么样的思路,请指点.最好写点CODE.能让我看的懂的就行了.谢谢
      

  4.   

    用SendStream的方法
    FMemoryStrem.Write(ReadSocketData^,SizeOf(TReadSocketData));
    其中ReadSocketData.S要定义为短字符串或者char数组
      

  5.   

    用楼上的方法就应该可以实现了,我的意思是将你的结构定义成定长后,将两个字段的值,全部转换为BYTE数组,接收后再转回来
      

  6.   

    type
      TReadSocketData = record
        i : Integer;
        s : string;
      end;
    //////////////////////////////////////////////////////////
    var
      Buffer : TByteDynArray;
      ReadSocketData : TReadSocketData;
    begin
      ReadSocketData.S := 'qwertyqwert';
      ReadSocketData.I := 2134567;  SetLength(Buffer,SizeOf(ReadSocketData.i)+Length(ReadSocketData.s));
      FillMemory(@Buffer[0],Length(Buffer),0);
      Move(ReadSocketData,Buffer[0],Length(Buffer));
      ClientSocket1.Socket.SendBuf(Buffer[0], Length(Buffer));
    end;
      

  7.   

    先压缩,再传输,最高效。
    tclientdataset.savetostream(astream);
    bstream:=zipstream(astream);
    socket.sendstream(bstream);