我需要与TCP Server
组件实现TIdTCPServer
连接。
我已经用GUI
(拖放)和它的工作做了。但我需要拆分表单和TCP
实现。我到目前为止看到的示例代码始终使用TIdTCPServer
作为TForm
类的成员。(拖放的结果)。
我如何调用我从TForm
实施的TCPConnection
课程
TCPConnection CConnection = new TCPConnection(Owner, this);
以下是我尝试创建TCP Server
连接的方法。
TCPConnection::TCPConnection(TComponent* Owner, TForm4* TSuperForm){
IdTCPServer1 = new TIdTCPServer(Owner);
IdTCPServer1->Bindings->Clear();
//IdTCPServer1->Bindings->Add()->SetBinding("10.10.2.103", 774);
IdTCPServer1->OnConnect = (TIdServerThreadEvent)(&OnConnect);
IdTCPServer1->OnExecute = (TIdServerThreadEvent)&OnExecute;
IdTCPServer1->OnDisconnect = (TIdServerThreadEvent)&OnConnect;
IdTCPServer1->OnException = (TIdServerThreadExceptionEvent)&OnException;
IdTCPServer1->DefaultPort = 774;
IdTCPServer1->Bindings->Add();
IdTCPServer1->Bindings->Items[0]->IP="10.10.2.103";
IdTCPServer1->Bindings->Items[0]->Port=774;
IdTCPServer1->ListenQueue = 15;
IdTCPServer1->MaxConnections = 15;
IdTCPServer1->TerminateWaitTime = 5000;
IdTCPServer1->Active = true;
this->TSuperForm = TSuperForm;
}
到目前为止,代码工作正常。但是当我尝试访问上下文时,连接丢失并且throws
异常
void TCPConnection::OnConnect(TIdContext *AContext){
String IP = AContext->Binding()->PeerIP;
}
void TCPConnection::OnException(TIdContext *AContext, Exception *AException)
{
ShowMessage("Error:" + AException->ToString());
}
Error
说TIdTaskThreadWork
(我会编辑错误,可能是错的)
如果我不尝试访问AContext,连接保持没有问题。
可能是关于线程,锁定列表,......
任何建议?
答案 0 :(得分:4)
那些功能演员看起来非常臭。您确定已将函数定义为__fastcall
,因为根本不需要函数强制转换。
如果您已正确定义它们,这应该就是您所需要的。
IdTCPServer1->OnConnect = &OnConnect;
// ... etc...
答案 1 :(得分:3)
这就是我的所作所为:
TIdTCPServer *TCPServer = new TIdTCPServer( this );
TCPServer->Active = false;
TCPServer->OnExecute = MyExecute;
TCPServer->DefaultPort = XXX;
TCPServer->Active = true;
然后我的MyExecute调用定义如下:
void __fastcall MyExecute( TIdContext* AContext );
其他回调的处理方式相同,不要忘记__fastcall,它应该可以正常工作。