Search code examples
c++builderindy

Indy10 > How to wait after WriteLn() call


My Environment:

Windows 7 Pro (32bit)
C++ Builder XE4

I would like to know about wait after WriteLn(); Following is my sample code.

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

I am putting wait (for(int idx=0;...) after WriteLn() so that the sending should be completed before Disconnection. However, I am not sure whether this is a correct way to wait. Also I have no idea how long should I wait (in this sample, I wait 1000 msec).

Question: Are there any function to know completion of WriteLn()?


Solution

  • You don't need to wait at all. WriteLn() is a blocking function. It does not exit until the entire string has been placed into the socket's outbound buffer. By default, a socket's LINGER option is enabled, which means a closed socket will attempt to send pending outbound data in the background before fully closing the port, even after your code has moved on.

    Refer to MSDN For more details:

    Graceful Shutdown, Linger Options, and Socket Closure

    For the record, Indy's Disconnect() does use both shutdown() and closesocket().