IdTcpClient的WriteBuffer如何发送大于255字符?

减小字体 增大字体 作者:佚名  来源:转载  发布时间:2011-02-15 11:09:19

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 beginReallocMem(Data, sizeof(TSendData) - 1 (*默认的一个字节*) + Data^.Content_len);
    RecvData(@(Data^.Content[0]),  Data^.Content_len);
  end;
  ProcessCommand(Data);
  FreeMem(Data);
end;
本文来自Delphi之窗,原文地址:http://www.52delphi.com

Tags:

作者:佚名
  • 好的评价 如果您觉得此文章好,就请您
      0%(0)
  • 差的评价 如果您觉得此文章差,就请您
      0%(0)

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论