核心提示:TypeSendData=packed record Command:string[5]; Content:string[255]; //不用数组服务器读不到,加上又不能完全发送,而且最大只能255e...
Type SendData=packed record
Command:string[5];
Content:string[255]; //不用数组服务器读不到,加上又不能完全发送,而且最大只能255
end;
如何修改?
我的做法如下
Type
SendData=packed record
Command:string[5];
Content:array[0..1024] of char;
end;
var SendData:TSendData;
begin
FillChar(SendData,SizeOf(SendData),0);
StrPCopy(@SendData.Command,'send');
StrPCopy(@SendData.Content,EdtMsg.Text);
IdTcpClient.WriteBuffer(SendData,SizeOf(SendData),True);
end;
服务器端这样取
ShowMessage(StrPas(@SendData.Content));
其他的答案大家分享下,比如使用PChar,Byte 对于无限大小的数据,可以定义如下的结构(操作起来应该还是相对比较方便的)
Type
PSendData = ^TSendData;
TSendData = packed record
Command:string[5];
Content_len: Integer;
Content:[0..0] of AnsiChar;
end;
对于这个结构,看似Content只有一个字节,实际上当你采用动态分配的时候,它就可以有N(包括0)个字节。只是需要关闭编译器的越界检查。
发送端
var
Data: PSendData;
strContent: String;//注意:这里只说ANSI Code,如果是使用Unicode版本(Delphi2009)的,另议
begin
strContent := ... //这里数据任意
GetMem(Data, sizeof(TSendData) - 1 (*默认的一个字节*) + Length(strContent));
Data^.Command := 'Text';
Data^.Content_len := Length(strContent);
Move(strContent[1], Data^.Content[0], Length(strContent));
SendData(Data);
FreeMem(Data);
end;
接收端
var
Data: PSendData;
begin
AllocMem(Data, sizeof(TSendData) - 1 (*默认的一个字节*) );
RecvData(Data, sizeof(TSendData) - 1 (*默认的一个字节*) );
if Data^.Content_len > 0 then begin
RecvData(@(Data^.Content[0]), Data^.Content_len);
end;
ProcessCommand(Data);
FreeMem(Data);
end;