IDTcpClient接收到服务机发来的数据包,数据包结构如下:
TimBytes = array of Byte;
_PACKHEADER = record
packSize: Integer; //数据包的总长度
packInfo: TPACKINFO; //包信息
dataSize: Integer; //data的长度
data: TimBytes; //PByte; //数据包
end {_PACKHEADER};
服务机通过TCP发送一幅图像,data数据即为该图像,TCPClient该如何读取这个数据包并将图像保存到本地;另如何将windows.copymemery保存在内存中的数据提取出来?
TimBytes = array of Byte;
_PACKHEADER = record
packSize: Integer; //数据包的总长度
packInfo: TPACKINFO; //包信息
dataSize: Integer; //data的长度
data: TimBytes; //PByte; //数据包
end {_PACKHEADER};
服务机通过TCP发送一幅图像,data数据即为该图像,TCPClient该如何读取这个数据包并将图像保存到本地;另如何将windows.copymemery保存在内存中的数据提取出来?
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.***来使用接收来的结构了。
// 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;
>>
_PACKHEADER = packed record
Result := 0;
if ABufSize > SizeOf(Integer) then Exit;
>> 改成:
if ABufSize < SizeOf(Integer) then Exit;
fs:TFileStream;fs:=TFileStream.Create('c:\a.bmp',fmCreate);
fs.WriteBuffer(buf,cnt);fs.Free;