这两天在做一个项目,就是通过idtcpClient循环向IdTCPserver发送消息,但是测试发现,IdTCPClient循环发送消息后,IDTCPServer只能收到第一个包,从第二个开始就收不到了。不知道什么原因。请高人帮忙给看看。
协议定义  PCommandData2 = ^TCommandData2;
  TCommandData2 = record
    FileDesc: array[0..1023] of char;
  end;
  PCommandHead = ^TCommandHead;
  TCommandHead = record
    Size : Integer;
  end;Client发送消息部分:
procedure TForm1.Button3Click(Sender: TObject);
const
  AMsgStyle : array[0..5] of string = ('FileName','FileNo','ClientType','GUID','UserId','Type');
var
  i: Integer;
  Str: String;  Head: PCommandHead;
  Data: PCommandData2;
begin
  if IdTCPClient.Connected then
  begin
      //传输附属信息
      for i := 0 to High(AMsgStyle) do
      begin
        case i of
          0: Str := '巧虎.avi'; //fileName
          1: Str := '1';                           //fileNo
          2: Str := 'PC';                          //clientType
          3: Str := '{D6B43501-8DE2-46E0-B24E-C7C800C71B00}';                         //itemID
          4: Str := '8746407';                     //userId
          5: Str := '10';                          //type
        end;
        FillChar(FSendBuffer,SizeOf(FSendBuffer),0);
        Head := PCommandHead(@FSendBuffer);
        Head.Size := htonl(Strlen(pchar(str))); 
        Data := PCommandData2(@FSendBuffer[SizeOf(TCommandHead)]);        StrLCopy(Data^.FileDesc, PChar(Str), SizeOf(Data^.FileDesc));
        idTCPClient.WriteBuffer(FSendBuffer,SIZEOF(FSendBuffer),True);
        
     end;
  end;
end;
Server接受消息部分:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  Head: PCommandHead;
  Data2: PCommandData2;
  Size: Integer;
begin
  AThread.Connection.ReadBuffer(FRecvBuffer,SizeOf(TCommandHead) + SizeOf(TCommandData2));
  Head := PCommandHead(@FRecvBuffer);
  Size := ntohl(Head^.Size);
  Data2 := PCommandData2(@FRecvBuffer[SizeOf(TCommandHead)]);  Memo.Lines.Add(Data2^.FileDesc);
end;期盼高人能帮我解惑。

解决方案 »

  1.   

    调试的时候,第一个参数FileName“巧虎”可以接收到,但是,后面的就无法收到,里面都是空,看到发送内容String都写到Buffer里面了,Server从第二次有接受动作,但是接收到的内容都是空。我很纳闷。
      

  2.   

    不懂的路过,不过给LZ提几个意见
    1 第一你的代码很多部分貌似都不全的说
    2 第二带有string类型的结构体赋值不要用fillchar
    3 idtcp接受数据也是有缓冲的,当缓冲占满的时候会出现各种问题,所以使用WriteBuffer发送数据时记得flush
    4 另外这里有个例子可供参考
    http://topic.csdn.net/u/20090116/21/a442c14d-3995-48ee-a00e-0aac3b597af7.html
      

  3.   

    不好意思,我在开贴的时候,忘记把发送缓冲区和接受缓冲区的定义,写上去,
    发送缓冲区: FSendBuffer: array[0..1023]  of byte
    接受缓冲区:FRecvBuffer: array[0..1023]  of Byte很简单的协议:包头(内容长度,4Byte) + 内容 这种格式,但是很奇怪,循环第一次,Server 可以接收到,以后全部为空。
      

  4.   


    2.fillchar是数组
    3.Flush以后也没有效果
      

  5.   

    原因已经找到,是我发送的Buffer太大了,我用Record只截取了收到内容的前半部分,其实后面全部是空字符。
    谢谢大家