【问题标题】:C++ Builder - Creating a TCP Server Connection programmatically with TIdTCPServerC++ Builder - 使用 TIdTCPServer 以编程方式创建 TCP 服务器连接
【发布时间】:2013-12-26 18:17:29
【问题描述】:

我需要用TIdTCPServer 组件实现TCP Server 连接。 我已经用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());    
}

ErrorTIdTaskThreadWork(我会编辑错误,可能是错误的) 如果我不尝试访问 AContext,则连接不会出现问题。

可能是关于线程,锁定列表,...

有什么建议吗?

【问题讨论】:

  • 通常不需要全部访问Bindings 属性,除非您只想在一个特定界面上提供服务。只需设置 DefaultPort。

标签: c++ tcp c++builder indy


【解决方案1】:

那些函数转换看起来很臭。你确定你已经将函数定义为__fastcall,因为根本不需要函数转换。

这应该是你所需要的,如果你定义正确的话。

IdTCPServer1->OnConnect = &OnConnect;
// ... etc...

【讨论】:

  • 类型转换确实有问题,并且会掩盖编译器错误消息。
  • 是的,问题是__fastcall。我已将它们声明为 void functionName;现在它在我添加 __fastcall 后工作。谢谢
【解决方案2】:

这就是我的工作:

TIdTCPServer *TCPServer = new TIdTCPServer( this );
TCPServer->Active = false;
TCPServer->OnExecute = MyExecute;
TCPServer->DefaultPort = XXX;
TCPServer->Active = true;

然后我的 MyExecute 调用是这样定义的:

void __fastcall MyExecute( TIdContext* AContext );

其他回调的处理方式相同,不要忘记 __fastcall,它应该可以工作。

【讨论】:

  • 我认为Active 无论如何默认为false。
  • 我相信它也是,但我总是在创作时把它弄错。习惯:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多