IDTcpClient接收到服务机发来的数据包,数据包结构如下:
  TimBytes = array of Byte;
  _PACKHEADER = record
    packSize: Integer;         //数据包的总长度
    packInfo: TPACKINFO;       //包信息
    dataSize: Integer;         //data的长度
    data: TimBytes; //PByte;   //数据包
  end {_PACKHEADER};
服务机通过TCP发送一幅图像,data数据即为该图像,TCPClient该如何读取这个数据包并将图像保存到本地;另如何将windows.copymemery保存在内存中的数据提取出来?

解决方案 »

  1.   

    不考虑粘包的情况下:buf:Array[0..G_MAXBUFLEN] of Byte;
    rec:_PACKHEADER;
    IdTcpClient1.ReadBuffer(buf,G_MAXBUFLEN);
    CopyMemory(@rec,buf,sizeof(integer)+sizeof(TPACKINFO)+sizeof(integer));
    SetLength(rec.Data,rec.datasize);
    CopyMemory(@rec.data[0],@buf[sizeof(integer)+sizeof(TPACKINFO)+sizeof(integer)],rec.datasize);
    这样就可以通过rec.***来使用接收来的结构了。
      

  2.   

    TimBytes应该是如下定义type  TimBytes = array [0..0] of Byte;  PPackHeader = ^_PACKHEADER;
    // result = 0 包未收完整
    //        > 0,收到一个完整包,并返回ABuffer处理掉多少个字节。
    function GetPacket(ABuffer: PChar; ABufSize: Integer; const ASaveFileName: string): Integer;
    var
      hdr: PPackHeader;
      hFile: THandle;
    begin
      Result := 0;
      if ABufSize > SizeOf(Integer) then Exit;  hdr := Pointer(ABuffer);
      if ABufSize < hdr.packSize then Exit;  Result := SizeOf(hdr^) + hdr.datasize - 1;
      hFile := FileCreate(ASaveFileName);
      FileWrite(hFile, hdr.data[0], hdr.datasize);
      CloseHandle(hFile);
    end;
      

  3.   

    还有,定义的时候,record前面最好加上packed_PACKHEADER = record 
    >>
    _PACKHEADER = packed record 
      

  4.   

    begin 
      Result := 0; 
      if ABufSize > SizeOf(Integer) then Exit; 
    >> 改成:
      if ABufSize < SizeOf(Integer) then Exit; 
      

  5.   

    另外怎么读取copymemory写入内存的数据?比如我将一幅图用copymemory方式写入了内存,怎么才能把这幅图存到本地?
      

  6.   


    fs:TFileStream;fs:=TFileStream.Create('c:\a.bmp',fmCreate);
    fs.WriteBuffer(buf,cnt);fs.Free;