2010-07-24 8 views
3

J'apprends coup de pouce/asio annonce a écrit 2 programmes (client et serveur) de e-book avec des modifications mineures. Fondamentalement, il doit se connecter à mon serveur. Quand j'essaie de se connecter au monde extérieur (un serveur aléatoire http) tout est bon et cela fonctionne mais quand je change destination « localhost: 40002 » il est dit argument invalide.C de client de boost/asio ne se connecte pas au serveur

code client:

#include <boost/asio.hpp> 
#include <iostream> 

int main() { 
    try { 
     boost::asio::io_service io_service; 
     boost::asio::ip::tcp::resolver::query query("localhost", 40002); 
     boost::asio::ip::tcp::resolver resolver(io_service); 
     boost::asio::ip::tcp::resolver::iterator destination = resolver.resolve(query); 
     boost::asio::ip::tcp::resolver::iterator end ; 
     boost::asio::ip::tcp::endpoint endpoint; 

     while (destination != end) { 
     endpoint = *destination++; 
     std::cout<<endpoint<<std::endl; 
     } 

     boost::asio::ip::tcp::socket socket(io_service); 
     socket.connect(endpoint); 
    } 
    catch (std::exception& e) 
    { 
     std::cerr << e.what() << std::endl; 
    } 
    return 0; 
} 

je l'ai fait « -l netstat » et il a montré que je suis vraiment à l'écoute de mon port pour serveur je pense que les travaux mais jamais à moins qu'ils ne se connectent pas

code du serveur:

#include <boost/asio.hpp> 
#include <iostream> 
#include <string> 
#include <ctime> 
std::string time_string() 
{ 
    using namespace std; 
    time_t now = time(0); 
    return ctime(&now); 
} 
int main() { 

    try { 
     boost::asio::io_service io_service; 
     boost::asio::ip::tcp::acceptor acceptor(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 40002)); 

     for (; ;) { 
     std::cout<<"Listening to"<<std::endl; 
     boost::asio::ip::tcp::socket socket(io_service); 
     acceptor.accept(socket); 

     std::string message = time_string(); 
     boost::system::error_code ignored_error; 
     boost::asio::write(socket, boost::asio::buffer(message), boost::asio::transfer_all(), ignored_error); 
     } 
    } 
    catch (std::exception& e) 
    { 
     std::cerr << e.what() << std::endl; 
    } 
    return 0; 

} 

quelqu'un peut-il laisser entendre pourquoi la connexion ne se produit pas

+0

+1 pour la publication de code exemple qui compile, il a rendu plus facile de répondre à votre question. –

Répondre

5

Le second parameter-ip::tcp::resolver::query est le nom du service, pas un numéro de port:

boost::asio::ip::tcp::resolver::query query("localhost", 40002); 

devrait être

boost::asio::ip::tcp::resolver::query query("localhost", "40002"); 

FYI, quand je compilé votre code sur mon système, il a échoué:

resolve.cc: In function ‘int main()’: 
resolve.cc:7: error: invalid conversion from ‘int’ to ‘boost::asio::ip::resolver_query_base::flags’ 
resolve.cc:7: error: initializing argument 2 of ‘boost::asio::ip::basic_resolver_query<InternetProtocol>::basic_resolver_query(const std::string&, boost::asio::ip::resolver_query_base::flags) [with InternetProtocol = boost::asio::ip::tcp]’ 

Je suis surpris qu'il ait été compilé pour vous.

+0

Je compile sur linux « g ++ -lboost_system -pthread client.cpp » – kurrata

+1

j'étais tout aussi surpris que compilé sur VC 2008 Express avec boost 1,38 ... –