Я использую Indy с C++ Builder XE3. Это идеальная система, но у меня есть некоторые проблемы. IdTCPServer работает очень хорошо, но когда у меня есть некоторые подключения к нему, и я хочу остановить сервер, тогда мое приложение застыло. Я пытаюсь сказать, как это делается шаг за шагом: 1) Запуск приложения (и прослушивания сервера) 2) дождитесь новых подключений (или имитируйте его, без разницы) 3) когда у нас 10-15 соединений - затем попробуйте чтобы остановить прослушивание сервера. 4) когда код пришел в IdTCPServer1-> Active = false - приложение будет замороженоIndy10 TCP Server Freezing
Я сделал небольшое видео. Возможно, это объясняет ситуацию намного лучше. 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;
}
Спасибо за посоветуйте!