C ++ Builder — создание соединения с сервером TCP программно с помощью TIdTCPServer

Мне нужно реализовать TCP Server связь с TIdTCPServer составная часть.
Я уже сделал это с GUI (тащить, тянуть & падение) и его работа. Но мне нужно разделить форму и TCP Реализации. Примеры кодов, которые я видел до сих пор, всегда используют TIdTCPServer как член TForm класс. (результат перетаскивания).

Как я звоню 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, соединение остается без проблем.

Может быть что-то о потоке, списке блокировки, …

Какие-либо предложения?

2

Решение

Эти функции выглядят очень вонючими. Вы уверены, что определили функции как __fastcall, так как приведения функций вообще не требуется.

Это должно быть все, что вам нужно, если вы правильно их определили.

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

Другие решения

Вот что я делаю:

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

Тогда мой вызов MyExecute определяется так:

void __fastcall MyExecute( TIdContext* AContext );

Другие обратные вызовы обрабатываются таким же образом, не забудьте __fastcall, и он должен работать.

3

По вопросам рекламы [email protected]