2013-12-09 119 views
2

我需要實現與TIdTCPServer組件的TCP Server連接。 我已經做了GUI(拖動&下降)及其工作。但我需要分割形式和TCP實現。我見過的示例代碼總是使用TIdTCPServer作爲TForm類的成員(拖放結果)。C++ Builder - 用TIdTCPServer以編程方式創建TCP服務器連接

我怎麼稱呼TCPConnection類,我已經從TForm的

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

通常不需要訪問'Bindings'屬性,除非你只想在一個特定的接口上服務。只需設置DefaultPort。 – Roddy

回答

4

這些功能看起來很臭。您確定您已將函數定義爲__fastcall,因爲根本不需要函數類型轉換。

這應該是你所需要的一切,如果你已經正確地定義了它們。

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

類型轉換確實存在問題,並且正在屏蔽編譯器錯誤消息。 –

+0

是的,問題是__fastcall。我曾宣佈他們爲void functionName;現在它在我添加__fastcall後生效。謝謝 –

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和它應該工作。

+0

我認爲無論如何'Active'默認爲false。 – Roddy

+0

我相信它也是如此,但我總是在創作上讓它失真。習慣:-) –