我在使用 Indy 时遇到问题TIdTCPClient
。如果套接字上有可用的数据,我想调用一个函数。为此,我有一个线程调用IdTCPClient->Socket->Readable(100)
。函数本身如下所示:
TMemoryStream *mStream = new TMemoryStream;
int len = 0;
try
{
if(!Form1->IdTCPClient2->Connected())
Form1->IdTCPClient2->Connect();
mStream->Position = 0;
do
{
Form1->IdTCPClient2->Socket->ReadStream(mStream, 1);
}
while(Form1->IdTCPClient2->Socket->Readable(100));
len = mStream->Position;
mStream->Position = 0;
mStream->Read(Buffer, len);
}catch(Exception &Ex) {
Form1->DisplaySSH->Lines->Add(Ex.Message);
Form1->DisplaySSH->GoToTextEnd();
}
delete mStream;
它不会在线程内直接调用,而是线程触发了一个事件,就是调用了这个函数。这意味着我使用Readable(100)
了两次,中间没有读取数据。因此,由于我不知道必须读取多少字节,所以我认为我可以读取一个字节,检查是否有更多可用字节,然后再读取另一个字节。这里的问题是 do while 循环不循环,它只运行一次。我猜 Readable 并不完全符合我的需要。有没有其他方法可以接收 Socket 中可用的所有字节?