2009-02-23 9 views
5

il est un peu étrange pour moi que boost.asio n'utilise pas le concept de base lorsque l'application client se connecte au serveur - en utilisant l'adresse IP et le port. Peut-être que je suis un peu noobie dans Boost - et je l'accepte - mais de toute façon je ne comprends pas.
Donc, j'ai le code comme celui-ci pour obtenir client connecté au serveur sur le localhost:Comment boost.asio peut-il identifier le port sur lequel mon application serveur écoute?


     boost::asio::io_service io_service; 
     tcp::resolver resolver(io_service); 
     tcp::resolver::query query("localhost", "daytime"); 
     tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); 
     tcp::resolver::iterator end; 

     tcp::socket socket(io_service); 
     boost::system::error_code error = boost::asio::error::host_not_found; 
     while(error && endpoint_iterator != end) { 
      socket.close(); 
      socket.connect(*endpoint_iterator++, error); 
     } 

Windows dans son WinSock 2.0 utilise deux paramètres - IP et le port - pour identifier le serveur.
Donc, la question est - comment exactement Asio trouve sur quel port le serveur écoute-t-il les connexions? Est-ce qu'il scanne tous les ports? Et, si c'est le cas, que se passera-t-il si deux serveurs écoutent sur des ports différents en même temps?

Répondre

5

Vous indiquez que vous souhaitez vous connecter à localhost sur le port utilisé par le service de jour. Il cherchera le numéro de port approprié dans le fichier de services (généralement C: \ WINDOWS \ system32 \ drivers \ etc \ services sous Windows, je crois/etc/services sous Unix). Vous pouvez également utiliser un numéro de port explicite ici.

+0

Je n'ai pas bien compris ce que le second paramètre signifie dans la requête ctor. le premier est l'adresse IP que je veux me connecter, non? et que signifie le second? – chester89

+0

Le deuxième paramètre est un numéro de port ou le nom d'un service. Si c'est un nom de service, asio le recherchera dans le fichier des services pour trouver le numéro de port approprié pour ce service. Jetez un oeil au fichier de services avec un éditeur de texte et vous verrez comment cela fonctionne. – Ferruccio

+0

ok, alors comment puis-je démarrer un serveur sur un port dont j'ai besoin? code pour cela sur le côté serveur est: boost :: asio :: io_service io_service; tcp :: accepteur accepteur (io_service, tcp :: endpoint (tcp :: v4(), 13)); – chester89

8

Essayez,

tcp::resolver::query query("localhost", boost::lexical_cast<string>(port));//assuming port is an int 

Pour répondre à votre question, le rappel que vous démarrez le serveur sur le port 13. Il se trouve que le port qui exécute le service de jour Linux (http://www.sorgonet.com/linux/linuxdaemons/). Par conséquent, ils peuvent ensuite utiliser query ("localhost", "daytime") plutôt que de spécifier le port.

0

ouvrir netcat écouter sur le port 13 sur le localhost il acceptera la connexion de la démo. tapez blabla quand il se connecte et vous verrez la sortie sur le programme de démonstration pour exécuter le netcat, exécuter: nc -l -p 13

Windows? pas de netcat? installer cygwin, et ajouter netcat

Questions connexes