try .. catch nötig bei Socketverbindung ?
-
Hallo,
zum Öffnen / Schließen einer Socketverbindung mache ich so etwas:
try { dynamic_cast<TClientSocket*>Form1->Components[ClientSocket_Index])->Host=... //Verbindung zum ServerSocket herstellen: dynamic_cast<TClientSocket*>(Form1->Components[ClientSocket_Index])->Open(); } catch (Exception &E) { //Verbindung beenden u. damit Port freigeben: dynamic_cast<TClientSocket*>(Form1->Components[ClientSocket_Index])->Close(); dynamic_cast<TClientSocket*>Form1->Components[ClientSocket_Index])->Socket->Close(); }
try-catch bräuchte ich doch hier gar nicht, weil doch dynamic_cast auf Zeiger gar keine Exceptions erzeugen, oder?
Wäre dies hier richtig(er):
dynamic_cast<TClientSocket*>Form1->Components[ClientSocket_Index])->Host=... if (dynamic_cast<TClientSocket*>(Form1->Components[ClientSocket_Index])->Open() ==0) { //Verbindung beenden u. damit Port freigeben: dynamic_cast<TClientSocket*>(Form1->Components[ClientSocket_Index])->Close(); dynamic_cast<TClientSocket*>Form1->Components[ClientSocket_Index])->Socket->Close(); }
Oder doch ganz anders???
Danke!!!!
-
Ja, letzteres ist richtig, zumindestens fast.
Du solltest den dynamic_cast jedoch nur einmalig durchführen:TClientSocket* socket = dynamic_cast<TClientSocket*>(Components[ClientSocket_Index]); if(socket) { socket->Host = "127.0.0.1"; if (socket->Open() == 0) { //Verbindung beenden u. damit Port freigeben: socket->Close(); } }
Wie du schon geschrieben hast, wird bei Zeigern keine Exception geworfen, sondern ein Nullzeiger zurückgegeben, daher die if-Abfrage.
P.S. Sofern du deinen Code innerhalb von Form-Methoden geschrieben hast, solltest du niemals "Form1->" o.ä. benutzen (außer du willst explizit auf eine fremde Form-Instanz zugreifen).
Und 2.: Dein Zugriff mittels "Components[ClientSocket_Index]" kommt mir auch sehr komisch vor! Wenn du statisch eine TClientSocket-Komponente auf deine Form gezogen hast, dann kannst du doch direkt mit dem Namen darauf zugreifen - und bei dynamischer Erzeugung merkst du dir den Namen in einer Klassenmembervariablen und hast ebenfalls Zugriff darauf...
Edit: ich sollte erst die Rechtschreibung überprüfen (oder nicht versuchen, schneller zu tippen als ich es eigentlich kann -)
-
Danke!
Compiler bringt aber bei "if (socket->Open() == 0)" den Fehler "kein zulässiger Typ"!?
-
Ich hatte nur deinen Code umformatiert, d.h. nicht selber überprüft, ob alle Methoden so korrekt sind. Open() hat keinen Rückgabewert, also
socket->Open(); if(socket->Active) { // ... }