我使用Indy與C++ Builder XE3。這是完美的系統,但我有一些問題。 IdTCPServer的工作非常好,但是當我有一些他的連接,我想停止服務器,然後我的應用程序凍結。我試着告訴我該怎麼做一步一步來: 1)啓動應用程序(和服務器偵聽) 2)等待新的連接(或模擬它,沒有區別) 3)當我們有10-15個連接 - 然後再嘗試停止服務器偵聽。 4)當代碼來到IdTCPServer1->活動=假 - 應用程序將被凍結Indy10 TCP服務器凍結
我做了小視頻。也許它更好地解釋情況。 http://www.youtube.com/watch?v=BNgTxYbLx8g
在這裏,我的代碼:
的onConnect:
EnterCriticalSection(&CritLock);
++ActiveConnections;
SetActiveConnections(ActiveConnections);
LeaveCriticalSection(&CritLock);
OnDisconnect:
EnterCriticalSection(&CritLock);
--ActiveConnections;
SetActiveConnections(ActiveConnections);
LeaveCriticalSection(&CritLock);
StopServer代碼:
void TForm1::StopServer()
{
TList *list = IdTCPServer1->Contexts->LockList();
try
{
for(int i = 0; i < list->Count; ++i)
{
TIdContext *AContext = reinterpret_cast<TIdContext*>(list->Items[i]);
try
{
if (AContext->Connection->Connected())
{
AContext->Connection->IOHandler->InputBuffer->Clear();
AContext->Connection->IOHandler->WriteBufferCancel();
AContext->Connection->IOHandler->WriteBufferClear();
AContext->Connection->IOHandler->WriteBufferClose();
AContext->Connection->IOHandler->CloseGracefully();
AContext->Connection->Disconnect();
}
}
catch (const Exception &e)
{
}
}
}
__finally
{
IdTCPServer1->Contexts->UnlockList();
}
IdTCPServer1->Contexts->Clear();
//IdTCPServer1->StopListening();
IdTCPServer1->Active = false;
}
謝謝指教!