boost::asio Fehlebehandlung
-
Hallo,
Bei meinem Bot habe ich einen kleinen Fehler gehabt, der mich nun 2 Stunden gekostet hat. Ich verstehe den Fehler nicht, vielleicht kanns mir ja jemand erklären.
Folgender Code:
socket::socket(boost::asio::io_service& io_service, boost::asio::ip::tcp::resolver::iterator iterator) : sock(io_service) { boost::system::error_code ec; auto end = decltype(iterator)(); while(iterator != end) { sock.connect(*iterator, ec); if(sock.is_open()) return; ++iterator; } throw stream_error("failed to connect to host: " + ec.message()); }Ersetzt man hier die Prüfung
if(sock.is_open())durch
if(!ec)dann funktioniert die Überprüfung nicht, offenbar wird ec in diesem Fall nicht von connect() gesetzt. Wieso?
-
Doku lesen:
Falls dir da drin nix auffällt, lies es nochmal, langsamer

Tip: "is_open()" fragt nicht ab ob der Socket "connected" ist.
-
Hm, alles seltsam. Naja, ich habe jetzt sowieso auf asynchrone IO umgebaut, da hab ich das Problem nicht, zumindest nicht auf diese Art.
Danke trotzdem für die Antwort!
-
Nix seltsam.
-
Doch seltsam.
-
in der doku steht if(ec) zum abfragen ob ein fehler vorliegt. du hast aber if(!ec) geschrieben. wo ist jetzt die seltsamkeit?
-
Wohl seltsam.
-
Also mir ging es eigentlich um den Teil:
Count Do(o)ku schrieb:
This function is used to connect a socket to the specified remote endpoint. The function call will block until the connection is successfully made or an error occurs.
The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.
-
wtf boost asio ist einfach nur seltsam.
-
ne oder? schrieb:
wtf boost asio ist einfach nur seltsam.
Ne, ist vollkommen logisch.
"is_open" heisst "der Socket existiert".
Und eben nicht "der Socket ist momentan connected".Sonst würde die Funktion ja auch "is_connected" heissen, nen?
Andere Libs verwenden "is valid" statt "is open", was vielleicht besser verständlich ist. Aber ich halte "is open" nicht für unlogisch oder gar falsch.
Hiesse die Klasse "connection" statt "socket" sähe die Sache etwas anders aus.