我将 Indy 与 C++ Builder XE3 一起使用。这是完美的系统,但我有一些问题。IdTCPServer 工作得非常好,但是当我与他有一些连接并且我想停止服务器时,我的应用程序就冻结了。我试着一步一步告诉我是怎么做的:1)启动应用程序(和服务器监听)2)等待新连接(或模拟它,没有区别)3)当我们有10-15个连接时 - 然后尝试停止服务器听。4) 当代码到达 IdTCPServer1->Active = false - 应用程序将被冻结
我做了小视频。也许它更好地解释了情况。http://www.youtube.com/watch?v=BNgTxYbLx8g
这里是我的代码:
连接:
EnterCriticalSection(&CritLock);
++ActiveConnections;
SetActiveConnections(ActiveConnections);
LeaveCriticalSection(&CritLock);
断开连接:
EnterCriticalSection(&CritLock);
--ActiveConnections;
SetActiveConnections(ActiveConnections);
LeaveCriticalSection(&CritLock);
停止服务器代码:
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;
}
谢谢指教!