【问题标题】:Indy10 > How to wait after WriteLn() callIndy10 > 如何在 WriteLn() 调用后等待
【发布时间】:2015-05-09 09:22:22
【问题描述】:

我的环境:

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();
}
//---------------------------------------------------------------------------

我将 wait (for(int idx=0;...) 放在 WriteLn() 之后,以便在断开连接之前完成发送。但是,我不确定这是否是正确的等待方式。另外我不知道我应该等待多长时间(在这个示例中,我等待 1000 毫秒)。

问:有没有知道WriteLn()完成的函数?

【问题讨论】:

  • 附带说明,您应该使用IndyTextEncoding_UTF8() 而不是IndyTextEncoding(TEncoding::UTF8)
  • 另外,Application-&gt;ProcessMessages(); 永远不应该在工作线程中被调用(OnExecute 被调用)。
  • @RemyLebeau 非常感谢您的 cmets。我从来没有注意到这些。

标签: c++builder indy


【解决方案1】:

您根本不需要等待。 WriteLn() 是一个阻塞函数。在整个字符串被放入套接字的出站缓冲区之前,它不会退出。默认情况下,启用了套接字的 LINGER 选项,这意味着关闭的套接字将在完全关闭端口之前尝试在后台发送待处理的出站数据,即使在您的代码继续运行之后也是如此。

更多详情请参考 MSDN:

Graceful Shutdown, Linger Options, and Socket Closure

郑重声明,Indy 的 Disconnect() 确实同时使用了 shutdown()closesocket()

【讨论】:

  • 非常感谢。我不知道 WriteLn() 是一个阻塞函数。我认为 WriteLn() 无需等待发送即可返回。还要感谢您提供指向 MSDN 的链接。
猜你喜欢
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 2019-02-27
  • 2019-10-15
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多