TidTCPServer und Client
-
Ich wollte jetzt die Kommunikation zwischen Client und Server lernen und darum ein bisschen rumexperimentieren.
Ich habe eine Form,wo Server und Client drauf sind.
IP = localhost
Port = 5000void __fastcall TForm1::Button1Click(TObject *Sender) { Server->Active = true; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { Client->Connect(10000); } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerConnect(TIdPeerThread *AThread) { MessageBox(0,"Yeah","Connected",MB_OK); } //---------------------------------------------------------------------------Die MessageBox wird erfolgreich angezeigt.
Allerdings friert mein Rechner danach sofort ein und ich kann mich nur noch mit dem Resettknopf retten.
Bevor ich jetzt hier noch ewig rum resette und meinen Rechner kaputt mache,wollte ich lieber gleich fragen,was da eigentlich falsch ist und was da jetzt passiert nachdem die Messagebox angezeigt wird.
-
Setz mal ein IdAntifreeze mit auf die Form
Server
TIdSocketHandle *handle = Server1->Bindings->Add(); handle->Port = int(CSpinEdit3->Value); handle->IP = ComboBox14->Text; Server1->Active = true; //------------- Server1->Active = false; TIdSocketHandle *delhandle; for(int i=0;i < Server1->Bindings->Count;i++) { delhandle = Server1->Bindings->Items[i]; delhandle->CloseSocket(true); } Server1->Bindings->Clear();
-
Des weiteren solltest du einen execute handler (OnExecute) auf dem Server definieren weil hier mit Threads gearbeitet wird
-
OK ich hab am Wochenende Zeit mich ausführlich damit zu beschäftigen was du vorgeschlagen hast.
Was hat es eigentlich mit diesem Codeabschnitt auf sich,den du geschrieben hast?
Speichert man da etwa alle Clients, die connecten in eine Liste so dass man später darauf einfacher zugreifen kann oder was hat es damit auf sich?
-
*Thema wieder ausgrab*
Also ich kriege es jetzt hin erfolgreich eine Verbindung auszubauen.
Jetzt ist das Problem, dass ich diese Verbindung nicht mehr beenden kann ohne dass da Fehlermeldungen wie "Terminate Thread Timeout" kommen.Ich hab jetzt Server und Client in 2 verschiedene Programme gesteckt.
Meine Fragen sind jetzt wie kann ich eine Verbindung
a) vom Server aus schließen.
b) vom Client aus schließen.TCPClient->DisconnectSocket(); TCPClient->Disconnect(); AThread->Terminate(); Handle->CloseSocket(true);zeigen gar keine Wirkung.
EDIT: Ich kann ja nochmal schreiben was ich habe.
Client:
void __fastcall TClient::Button1Click(TObject *Sender) { TCPClient->Connect(10000); } //--------------------------------------------------------------------------- void __fastcall TClient::Button2Click(TObject *Sender) { TCPClient->DisconnectSocket(); }Server:
//Header struct TConnectedClient { TDateTime Connect; TDateTime LastAction; AnsiString IP; TThread *ClientThread; TIdSocketHandle* ClientHandle; };void __fastcall TServer::TCPServerConnect(TIdPeerThread *AThread) { TConnectedClient* NewClient = new TConnectedClient; NewClient->Connect = Now(); NewClient->LastAction = NewClient->Connect; NewClient->IP = AThread->Connection->Socket->Binding->IP; NewClient->ClientThread = AThread; NewClient->ClientHandle = TCPServer->Bindings->Add(); NewClient->ClientHandle->IP = NewClient->IP; NewClient->ClientHandle->Port = 5000; AThread->Data = reinterpret_cast<TObject*>(NewClient); AThread->FreeOnTerminate = true; try { ClientList->LockList()->Add(NewClient); } __finally { ClientList->UnlockList(); Edit1->Text = NewClient->IP; // Zum testen ob Client connected hat. } }