您现在的位置:首页 >> 网络通讯 >> Indy >> 内容

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

时间:2011/9/3 15:48:05 点击:

  核心提示: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

ReallocMem(Data, sizeof(TSendData) - 1 (*默认的一个字节*) + Data^.Content_len);
    RecvData(@(Data^.Content[0]),  Data^.Content_len);
  end;
  ProcessCommand(Data);
  FreeMem(Data);
end;

作者:网络 来源:转载
  • 上一篇:Indy10 控件IdFTP 快速上手指南
  • 下一篇:没有了
  • 共有评论 0相关评论
    发表我的评论
    • 大名:
    • 内容:
    本类推荐
    • 没有
    本类固顶
    • 没有
  • 盒子文章(www.2ccc.com) © 2017 版权所有 All Rights Reserved.
  • 沪ICP备05001939号