2009-06-24 9 views
1

Salutations. Je commence tout juste avec la librairie boost :: asio et j'ai rencontré des difficultés au début de boost :: asio :: ip :: tcp :: iostream.Boost asio ip tcp iostream Détection d'erreur

Ma question comporte deux parties:

1.) Comment peut-on connecter un iostream en utilisant simplement l'hôte et le numéro de port?

Je peux faire en sorte que les exemples de client et server [boost.org] fonctionnent bien comme codés. Le serveur spécifie le port explicitement:

boost::asio::io_service io_service; 

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

Port 13 est un port bien connu pour un service "de jour".

L'exemple de client se connecte en spécifiant un hôte et le nom du service:

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

Pour ma propre application, je voudrais mettre le serveur sur un port arbitraire et se connecter par numéro comme indiqué ci-dessous:

serveur:

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); 
... 

Si, dans le client, j'essaie de spécifier le numéro de port directement (au lieu d'un service par nom), le flux ne parvient pas à se connecter. Y a-t-il un moyen de faire cela? Ce n'est pas clair pour moi quels pourraient être les arguments pour se connecter.


2.) Quel est le meilleur moyen pour tester le succès d'un appel à iostream :: connect?

La fonction renvoie void et aucune exception n'est levée. La seule méthode que j'ai imaginée jusqu'ici est de tester stream.fail() et/ou stream.good(). Est-ce la façon de le faire, ou existe-t-il une autre méthode?


Un conseil sur l'un de ces deux ou sur les deux serait apprécié. De plus, si je néglige la documentation pertinente et/ou des exemples, ce serait bien. Jusqu'à présent, je n'ai pas été en mesure de répondre à ces questions en lisant les documents de la bibliothèque ou en cherchant sur le net.

Répondre

3

Je ne sais pas pourquoi asio ne fonctionne pas (au moins avec Boost 1.35.0) avec un numéro de port exprimé en int. Mais, vous pouvez spécifier le numéro de port en tant que chaîne. c'est-à-dire

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

devrait fonctionner.

concernant la détection d'erreur:

tcp::socket a une méthode de connexion() qui prend et le point final et une référence à un objet boost::system::error_code qui vous dira si connecté avec succès.

+0

Merci pour l'aide. Existe-t-il alors un moyen de prendre un socket tcp :: et de l'insérer dans un tcp :: iostream? –

+0

@Adam - Je ne sais pas. Cela fait un moment que j'ai travaillé avec asio et le code que je regarde utilise le socket directement pour les E/S (en utilisant socket :: send et socket :: read_some) plutôt que d'utiliser un iostream. – Ferruccio

+0

Une alternative légèrement plus propre est, sockStream.connect ("localhost", lexical_cast (port)); –

0

Même si aucune erreur n'est renvoyée, stream.error() contient le dernier code d'erreur.J'ai utilisé le code

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

Vous pouvez également vérifier que le coup de pouce d'erreur spécifique :: asio :: :: erreur connection_refused.

Questions connexes