我的环境:
Windows 7 Pro (32bit)
C++ Builder XE4
我想了解WriteLn()之后的等待; 以下是我的示例代码。
void __fastcall TForm1::IdTCPServer1Execute(TIdContext *AContext)
{
UTF8String rcvdStr;
rcvdStr = AContext->Connection->IOHandler->ReadLn(
IndyTextEncoding(TEncoding::UTF8) );
TList *threads;
TIdContext *ac;
threads = IdTCPServer1->Contexts->LockList();
ac = reinterpret_cast<TIdContext *>(threads->Items[0]);
UTF8String sendStr;
sendStr = "send:" + rcvdStr;
ac->Connection->IOHandler->WriteLn(sendStr);
for(int idx=0; idx<10; idx++) {
Sleep(100);
Application->ProcessMessages();
}
ac->Connection->Disconnect();
IdTCPServer1->Contexts->UnlockList();
}
//---------------------------------------------------------------------------
我在WriteLn()之后放置wait(for(int idx = 0; ...)),以便在Disconnection之前完成发送。但是,我不确定这是否是一种正确的等待方式。另外我不知道我应该等多久(在这个样本中,我等待1000毫秒)。
问题:是否有任何函数可以知道WriteLn()的完成情况?
答案 0 :(得分:1)
你根本不需要等待。 WriteLn()
是阻止功能。在将整个字符串放入套接字的出站缓冲区之前,它不会退出。默认情况下,启用套接字的LINGER选项,这意味着关闭的套接字将在完全关闭端口之前尝试在后台发送待处理的出站数据,即使在代码移动之后也是如此。
有关详细信息,请参阅MSDN:
Graceful Shutdown, Linger Options, and Socket Closure
为了记录,Indy的Disconnect()
确实同时使用shutdown()
和closesocket()
。