IdTCPClient如何接收数据,各位英雄来看看!!!

elite01 2006-02-21 01:57:37
IdTCPClient先发送结构数据
TLogin = record
OrderID : Integer;
MAC : array [1..20] of char;
KEY : array [1..256] of char
end;
IdTCPClient1.WriteBuffer(ord_login,SizeOf(Ord_Login),True);
服务端是用VC++写的回复
struct LoginRetrun
{
int order_id; //0|0x80000000
int status;//状态(1成功,0失败)
int errorlen;//错误信息长度
char error[errorlen];
}
,我如何去接受该数据呢?
问题:
1.我在发完是否直接用IdTCPClient1.ReadBuffer(Ord_Login,SizeOf(Ord_Login));接受
,还是要另开线程呢,要考虑延时吗?

2.由于int errorlen;//错误信息长度,是变长,SizeOf就不好用了,我该如何接受呢?
...全文
1336 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
elite01 2006-02-22
  • 打赏
  • 举报
回复
是否是: 那个IdTCPCLient,发的,就必须用该IdTCPCLient接受?
elite01 2006-02-22
  • 打赏
  • 举报
回复
可是我用Form1的IdTCPCLient,就正确了???
elite01 2006-02-22
  • 打赏
  • 举报
回复
procedure TRec.Execute;
var
client : TIdTCPClient;
half : THalfLogin;
begin
client := TIdTCPClient.Create(nil);
try
client.Host := Form1.edt1.Text;
client.Port := StrToInt(Form1.edt2.Text) ;
try
client.Connect(10000);
except
on E: EIdException do begin
ShowMessage('An network error occurred while trying to connect: '
+ E.Message);
end;
end;
client.ReadBuffer(half,SizeOf(half));
Form1.edt3.Text := IntToStr(half.OrderID);
Form1.edt4.Text := string(half.MAC);

finally
client.Disconnect;
client.Free;
client := nil;
end;


end;


我在 client.ReadBuffer(half,SizeOf(half));这设断点,可是好像没往下走
也没更新界面
getit911 2006-02-21
  • 打赏
  • 举报
回复
自己实例化一个就行了,只要一直在读,就不会发生接收缓冲溢出,况且TIdTCPCLient自己有一个默认的32K缓冲区,这点数据没问题。
human_2 2006-02-21
  • 打赏
  • 举报
回复
会,服务缓冲区满了就发不动了
elite01 2006-02-21
  • 打赏
  • 举报
回复
getit911(Windows转Linux中) :
那我不妨用线程接受,你看是在线程中直接调用该IdTCPCLient,
还是自己实例化一个TIdTCPCLient类呢,

还有,如果服务段不停地发数据,是否会溢出呢?
getit911 2006-02-21
  • 打赏
  • 举报
回复
indy是阻塞式结构,没有数据就一直停在那,直到有数据或超时
elite01 2006-02-21
  • 打赏
  • 举报
回复
getit911(Windows转Linux中) :
IdTCPCLient接着读就可以了.
为什么呀,如果发送延时了能,它会自己等待吗?
getit911 2006-02-21
  • 打赏
  • 举报
回复
IdTCPCLient接着读就可以了.
第二个问题比较麻烦,需要连续读2次,先读

int order_id; //0|0x80000000
int status;//状态(1成功,0失败)
int errorlen;//错误信息长度
}数据到delphi的记录,然后取出errorlen长度 
第2次读后面错误数据
cjf1009 2006-02-21
  • 打赏
  • 举报
回复
1、单独开线程,在里面IdTCPClient1.ReadBuffer(Ord_Login,SizeOf(Ord_Login));
2、SizeOf(int类型)=4,是定长的,不用担心
elite01 2006-02-21
  • 打赏
  • 举报
回复
快来看看!

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧