2010-07-24 3 views
3

Я изучаю boost/asio ad написал 2 программы (клиент и сервер) из электронной книги с небольшими изменениями. В основном он должен подключаться к моему серверу. Когда я пытаюсь подключиться к внешнему миру (какой-то случайный http-сервер), все хорошо, и он работает, но когда я меняю назначение на «localhost: 40002», он говорит о недопустимом аргументе.C++ boost/asio клиент не подключается к серверу

код клиента:

#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; 
} 

я сделал «NETSTAT -l», и он показал, что я по-настоящему слушать мой порт так сервер я думаю, что работает на но не менее они не связывают

код сервера:

#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; 

} 

Может кто-то намекнуть, почему соединение не происходит

+0

+1 для отправки кода примера, который компилируется, облегчил ответ на ваш вопрос. –

ответ

5

second parameter в ip::tcp::resolver::query это имя службы, а не номер порта:

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

должен быть

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

FYI, когда я составил свой код на моей системе это не удалось:

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]’ 

Я удивлен, что он скомпилирован для вас.

+0

Я компилирую его на linux «g ++ -lboost_system -pthread client.cpp» – kurrata

+1

Я был так же удивлен, что он скомпилирован на VC 2008 Express с boost 1.38 ... –

Смежные вопросы