Мне нужно реализовать 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, соединение остается без проблем.
Может быть что-то о потоке, списке блокировки, …
Какие-либо предложения?
Эти функции выглядят очень вонючими. Вы уверены, что определили функции как __fastcall
, так как приведения функций вообще не требуется.
Это должно быть все, что вам нужно, если вы правильно их определили.
IdTCPServer1->OnConnect = &OnConnect;
// ... etc...
Вот что я делаю:
TIdTCPServer *TCPServer = new TIdTCPServer( this );
TCPServer->Active = false;
TCPServer->OnExecute = MyExecute;
TCPServer->DefaultPort = XXX;
TCPServer->Active = true;
Тогда мой вызов MyExecute определяется так:
void __fastcall MyExecute( TIdContext* AContext );
Другие обратные вызовы обрабатываются таким же образом, не забудьте __fastcall, и он должен работать.