关于IdTCPClient的接收数据问题 (100分)

  • 主题发起人 主题发起人 cacao_cacao
  • 开始时间 开始时间
C

cacao_cacao

Unregistered / Unconfirmed
GUEST, unregistred user!
请教各位大虾,在IdTCPClient中如何知道BUFFER中有数据?
在INDY的DEMO中是用一个时钟不停的READLN来循环取数的,但这样的话,当BUFFER为空时,
程序就处于等待状态等待SERVER端发送信息到BUFFER,在CLIENT看来,程序似乎处于死机状态。
有无方法来判断,只有当BUFFER不为空时才触发IdTCPClient.Readln
 
一个办法好像是做到线程里边去,另外一个办法好像是有个EXTRACTBUFFER 之类的函数可以监测是否可读,忘记了,你自己找找吧,看源代码
 
我用TCPClient->ReadFromStack()判断是否有数据,等待时间设为2毫秒,有数据再调用ReadBuffer 。运行效果还不错。
我的代码:
len = TCPClient->ReadFromStack(False, 2, True, NULL);

if(len==0) return(len);

TCPClient->ReadBuffer(str, len);

ReadFromStack()函数说明:
Reads data from the protocol stack using the socket binding.


function ReadFromStack(const ARaiseExceptionIfDisconnected: boolean; const ATimeout: integer; const AUseBuffer: boolean; ADestStream: TIdBuffer): integer; virtual;

Parameters

const ARaiseExceptionIfDisconnected: boolean = true

Raise an Exception when disconnected. Default value is True.


const ATimeout: integer = IdTimeoutInfinite

Timeout value to wait for a readble socket handle. Default value is IdTimeoutInfinite.


const AUseBuffer: boolean = true

Add data read to the Indy buffer. Default value is True.


ADestStream: TIdBuffer = nil

Destination for the data read. Default value is Nil.


Returns

Integer - Number of bytes read.


请高手指正。
 
多人接受答案了。
 
后退
顶部