type
myrecord= record
m_name :integer;
m_id :integer;
end;
Pmyrecord =^myrecord;服务器:
var
p:pointer;
c :Pmyrecord;
begin
c := new(Pmyrecord);
c.m_name :=0;
c.m_id :=0;
new(p);
getmem(p,1024);
memo1.lines.add(inttostr(Socket.ReceiveBuf(p^,1024)));
c := p;
caption :=c.m_name;
freemem(p,1024);
end;
客户端:
var
  c :Pmyrecord;
  p :pointer;
begin
  c := new(Pmyrecord);
  c.m_name :=333;
  c.m_id :=5555;
  getmem(p,1024);
  p :=c;
memo1.lines.add(inttostr(ClientSocket1.Socket.SendBuf(p^,1024)));
FreeMem (P, 1024);
end;
为什么接收不到发送的数据,接收到的是非常大的象是地址的数据.   
可以以发送指针的形式发送结构体内容吗?
有什么好的方法发送带有相同结构头的不同的结构体呢?

解决方案 »

  1.   

    如果客户端写
      V_PSmpPdu:=new(PSmpPdu);
      V_PSmpPdu.FCrossID:=64;
      V_PSmpPdu.FCommand:=6 ;
      getmem(p,1024);
      p :=V_PSmpPdu;
      Fr_Main.ClientSocket1.Socket.SendBuf(p^,1024);
      FreeMem (P, 1024);
    传输没有任何问题
    但是如果写成:
      V_PSmpPdu:=new(PSmpPdu);
      V_PSmpPdu := HexToStruct(DesData);
      getmem(p,1024);
      p :=V_PSmpPdu;
      Fr_Main.ClientSocket1.Socket.SendBuf(p^,1024);
      FreeMem (P, 1024);
    其中HexToStruct(DesData);是一个函数,返回值为PSmpPdu类型的指针.就会出现错误
    其中HexToStruct(DesData)函数为:
     if First_DateID=$C5 then  //查询阶段表
      begin
        FillChar( V_SmpStageTable, Sizeof( V_SmpStageTable ), 0 );
        V_SmpStageTable.M_SmpBase.FCrossID := DesData[0]*256+DesData[1];
        V_SmpStageTable.M_SmpBase.FType := SMP_GET_RESPONSE;
        V_SmpStageTable.M_SmpBase.FCommand := 6;
        V_SmpStageTable.C_PhasesTableNumber:= DesData[5];
        Result:= PSmpPdu( @V_SmpStageTable );
        Exit;
      end;
    其中V_SmpStageTable.M_SmpBase为PSmpPdu类型,即所有结构具有的相同的头
      

  2.   

    memo1.lines.add( ClientSocket1.Socket.SendBuf(c, sizeof(c)) );