Frage

Grüße. Ich bin nur mit der boost :: asio Bibliothek Sie beginnen und haben in einigen frühen Schwierigkeiten laufen im Zusammenhang mit boost :: asio :: ip :: tcp :: Iostream.

Meine Frage hat zwei Teile:

1.) Wie kann man eine Iostream Verbindung mit einfach Nummer Host und Port?

kann ich das Client und Server [boost.org] Beispiele gut funktionieren wie codiert. Der Server gibt den Port explizit:

boost::asio::io_service io_service;

tcp::endpoint endpoint(tcp::v4(), 13);
tcp::acceptor acceptor(io_service, endpoint);

Port 13 ist ein bekannt Port für einen „Tag“ Service.

Das Client Beispiel verbindet durch einen Host und den Namen des Dienstes festgelegt wird:

tcp::iostream s(argv[1], "daytime");

Für meine eigene Anwendung, ich möchte den Server auf einen beliebigen Port setzen und nach Nummer verbinden, wie unten dargestellt:

Server:

boost::asio::io_service io_service;
tcp::endpoint endpoint(tcp::v4(), port);
tcp::acceptor acceptor(io_service, endpoint);
acceptor.accept(*this->socketStream.rdbuf());
...

Client:

boost::asio::ip::tcp::iostream sockStream;
...
sockStream.connect("localhost", port);
...

Wenn im Client, versuche ich direkt die Portnummer angeben (anstelle eines Service-Name), schlägt der Strom zu verbinden. Gibt es eine Möglichkeit, dies zu tun? Es ist mir nicht klar, was die Argumente könnte verbinden / sein sollte.


2.) Was ist der bevorzugte Weg, um den Erfolg eines Aufrufs zu testen, um iostream :: zu verbinden?

Die Funktion void zurückgibt und keine Ausnahme ausgelöst. Die einzige Methode, die ich entwickelt habe, so weit ist die stream.fail zu testen () und / oder stream.good (). Ist dies der Weg, es zu tun, oder gibt es eine andere Methode.


Tipps von einem oder beiden von diesen würden geschätzt. Auch, wenn ich einschlägige Dokumentation bin mit Blick auf und / oder beispielsweise solche wäre schön. Bisher habe ich nicht in der Lage gewesen, diese Fragen zu beantworten, indem sie die Bibliothek Dokumente zu lesen oder die Suche im ‚net.

War es hilfreich?

Lösung

Ich weiß nicht, warum Asio nicht funktioniert (zumindest mit Boost-1.35.0) mit einer Portnummer als int ausgedrückt. Aber können Sie die Port-Nummer als String angeben. d.

tcp::iostream s(hostname, "13");

sollte funktionieren.

über Fehlererkennung:

tcp::socket hat eine Methode connect (), die und Endpunkt und einen Verweis auf ein boost::system::error_code Objekt nimmt die Ihnen sagen, wenn es erfolgreich verbunden.

Andere Tipps

Auch wenn kein Fehler zurückgegeben wird, stream.error () enthält den neuesten Fehlercode. Ich habe den Code

do
{
    m_stream.clear();
    m_stream.connect(host, port);
}
while(m_stream.error());`

Sie können auch nur prüfen, für den spezifischen Fehler boost :: asio :: Fehler :: connection_refused.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top