在Server端和Client端定义了相同的Record结构,需要实现在Server端对Record变量进行更新,串行为Byte流,发送到Client端,再使用相同的Record结构进行还原。如何实现?示例如下:
type
  TMsg =Record
    id : Integer;
    msg: String;
  end;
SendMsg, ReceiveMsg :TMsg;//Server:procedure TForm1.Button1Click(Sender: TObject);
begin
  SendMsg.id :=1;
  SendMsg.msg :='怎样通过Socket传送Record?'; 
    //怎样把SendMsg发送到Client?
  //sckServer
  //不能使用 sckServer.SendBuf(SendMsg,SizeOf(SendMsg));end;//Client:
procedure TfrmClient.sckClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
   re :PChar;
   sbuf :string;
   relong :Integer;begin
   re :=nil;
   while socket.ReceiveLength >0 do
   begin
      //申请内存
      re :=AllocMem(socket.ReceiveLength);
    Try
      relong :=socket.ReceiveLength;
      Socket.ReceiveBuf(re^,Socket.ReceiveLength);
      sbuf :=StrPas(re);
      SetLength(sbuf,relong);
      
      //怎样把sbuf还原为ReceiveMsg?
      //
    Finally
      FreeMem(re);
    end;
   end;
end;还有,如何把一个Record的结构及其数据装入另一个Record的变量内?急等用!多谢。

解决方案 »

  1.   

    发送:
    var
      P: PChar;
    GetMem(P, 4 + Length(SendMsg.msg));
    Move(SendMsg.id, P^, 4);
    Move(SendMsg.msg[1], P[4], Length(SendMsg.msg));
    sckServer.SendBuf(P^, 4 + Length(SendMsg.msg));
    FreeMem(P);接收:
    var
      P: PChar;
      RLen: Integer;
    RLen := socket.ReceiveLength;
    GetMem(P, RLen+1);
    Socket.ReceiveBuf(P^, RLen);
    P[RLen] := #0;
    ReceiveMsg.id := PInteger(P)^;
    ReceiveMsg.msg := PChar(P[4]);
      

  2.   

    接收 加一句:
    FreeMem(P);
      

  3.   

    可以将整个record对象做为一个缓冲直接发送。。
    或者也可能需要将此record对象拷贝到缓冲区 再发送。。
    接收端 相应的用类型强行转换就OK
      

  4.   

    beyondtkl(大龙驹<*step by step:Cpp&&Crack*>) ,请问具体如何实现?小弟新手,还望指点。
      

  5.   

    同意 li_chengbin(瞌睡虫) 
    的作法
    大龙驹说的也是这么回事
      

  6.   

    D7下,IDUDPClient Send:{
                  SendMsg.ID:=htonl(1); 数值型需要转换成网络顺序字
                  SendMsg.MSG:='test';
                  UDPCLIENT.SENDBUFF(IP,PORT,SENDMSG,SIZEOF(SENDMSG));
                }
    Server Read:{
                  UDPServer.ReadBuff(RecvMsg,sizeof(RecvMsg));
                  TagID:=ntohl(RecvMsg.id)//将网络字节序转换成主机字节序
                  if TagID=1 then
                         ShowMessage(RecvMsg.Msg);
                 }
      

  7.   

    var 
      MyStream: TMemoryStream;
    -------  
      MyStream := TMemoryStream.Create;
      MyStream.WriteBuffer(SendMsg,SizeOf(SendFont));
      try
        try
          sckServer.SendStream(MyStream);
        finally
          MyStream.Free;
        end;
      except
      end;---------
    var
      MyStream: TMemoryStream;
    begin
      if NumberBytes=-1 then exit; 
      MyStream := TMemoryStream.Create;
      try
        Socket.ReadStream(MyStream);
        MyStream.ReadBuffer(ReceiveMsg ,SizeOf(ReceiveFont));
      finally
        MyStream.Free;
      end;