使用TIdTCPClient向TIdTCPServer传送结构数据,请教如何才能把一个TSMSConnect结构的数据传到服务器端。本人不熟悉使用Indy10,求高手帮忙!!
 TSMSHead = packed record
     SequenceID : Integer;
     CommandID : Integer;
     TotalLength : Integer;
  end;
  PSMSHead = ^TSMSHead;  TSMSConnect = packed record
     Head : TSMSHead;
     UID : array[0..19] of char;
     PWD : array[0..19] of char;
     Version : Byte;
  end;
  PSMSConnect = ^TSMSConnect;

解决方案 »

  1.   

    idtcpclient.writebuffer( PSMSConnect^,sizeof( TSMSConnect ) );//应该是这样吧
      

  2.   

    好像Indy10的IdTCPClient找不到writebuffer了?????
      

  3.   

    好像是这样调用了,没有用过indy 10
    IdTCPClient1.IOHandler.Write(PSMSConnect^);
      

  4.   

    var
       C:TSMSConnect;
       P:PIdBytes;....
      C.Head.SequenceID := htonl(CreateID);
      C.Head.CommandID := htonl(CMD_CONNECT);
      C.Head.TotalLength := htonl(SizeOf(TSMSConnect));
      strpcopy(C.UID,PChar('lfpsoft'));
      strpcopy(C.PWD,PChar('lfpsoft'));
      C.Version := SMS_VERSION_10;  P:=@C; // DM.IdTCPClient.Socket.Write(buf^);
      DM.IdTCPClient.IOHandler.Write(P^)
      

  5.   

    Project IndyClient.exe raised exception class EAccessViolation with 'Access violation at address 00405D50 in module 'IndyClient.exe'. Write of address 00FFFFF8'.
      

  6.   

    改成这样还是出错。到底是什么问题呢?
    var
       C,D:TSMSConnect;
       P:TBytes;begin  
      C.Head.SequenceID := htonl(CreateID);
      C.Head.CommandID := htonl(CMD_CONNECT);
      C.Head.TotalLength := htonl(SizeOf(TSMSConnect));
      strpcopy(C.UID,PChar('lfpsoft'));
      strpcopy(C.PWD,PChar('lfpsoft'));
      C.Version := htonl(SMS_VERSION_10);
      CopyMemory(@P,@C,SizeOf(C));
      DM.IdTCPClient.IOHandler.Write(P);
      

  7.   

    idtcpclient.writebuffer( PSMSConnect^,sizeof(TSMSConnect),true);
    9是这样写,10没用过
      

  8.   

    错在这句:CopyMemory(@P,@C,SizeOf(C));
    应该是   CopyMemory(@P, @C[0], SizeOf(C));以下是我的完整代码:procedure TForm1.btn1Click(Sender: TObject);
    var
      pkt: TSMSConnect;
      buf: TBytes;
    begin
      // 填写pkt
      pkt.Head.SequenceID := 1000;
      pkt.Head.CommandID := 119;
      StrLCopy(pkt.UID, 'I love you', SizeOf(pkt.UID));
      // ...  // 准备缓冲区数据
      SetLength(buf, SizeOf(TSMSConnect));
      Move(pkt, buf[0], SizeOf(TSMSConnect));  tcpClient.Connect;
      tcpClient.Socket.Write(buf);
      tcpClient.Disconnect;
    end;procedure TForm1.tcpServerExecute(AContext: TIdContext);
    var
      pkt: PSMSConnect;
      buf: TBytes;
    begin
      SetLength(buf, SizeOf(TSMSConnect));
      AContext.Connection.Socket.ReadBytes(buf, SizeOf(TSMSConnect), False);  pkt := PSMSConnect(@buf[0]);
      Assert(pkt.Head.SequenceID = 1000);  mmo1.Lines.Add(pkt.UID);
    end;
      

  9.   

    用刚才的CopyMemory试了一下,发现参数写反了,应该是
      CopyMemory(@C[0], @P, SizeOf(C));