2013-12-10 7 views
0

Im, следуя учебным пособиям на официальном веб-сайте boost http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/tutorial/tutdaytime1.html.Boost.asio server-client. Подключите между двумя компьютерами

Программа работает отлично, если я подключаюсь к «localhost» или «127.0.0.1» на той же машине. Но если я запустил клиент на другом компьютере с той же сетью, он не смог подключиться к серверу. Почему это происходит? и что мне нужно сделать, чтобы заставить клиента работать в другой сети?

Ошибка: connect: соединение не может быть выполнено, потому что целевая машина активно отказалась.

Клиент:

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

using boost::asio::ip::tcp; 

int main() 
{ 
    try 
    { 
     boost::asio::io_service io_service; 

     tcp::resolver resolver(io_service); 

     char* serverName = "localhost"; 
     tcp::resolver::query query(serverName, "daytime"); 
     tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); 

     tcp::socket socket(io_service); 
     while(true) 
     { 
      boost::asio::connect(socket, endpoint_iterator); 

      for (;;) 
      { 
       boost::array<char, 128> buf; 
       boost::system::error_code error; 

       size_t len = socket.read_some(boost::asio::buffer(buf), error); 

       if (error == boost::asio::error::eof) 
        break; // Connection closed cleanly by peer. 
       else if (error) 
        throw boost::system::system_error(error); // Some other error. 

       std::cout.write(buf.data(), len); 
       std::cout <<"\n"; 
      } 
     } 
    } 
    catch (std::exception& e) 
    { 
     std::cerr << e.what() << std::endl; 
    } 

    return 0; 
} 

Сервер:

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

using boost::asio::ip::tcp; 

int main() 
{ 
    try 
    { 
     boost::asio::io_service io_service; 

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

     for (;;) 
     { 
      tcp::socket socket(io_service); 
      acceptor.accept(socket); 

      std::string message = "This is the Server!"; 

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

    return 0; 
} 
+0

Какое сообщение об ошибке? –

+0

Ошибка: connect: соединение не может быть выполнено, потому что целевая машина активно отказалась от него. –

ответ

0

Чтобы запустить сервер и клиент на отдельные сети, сделать клиент подключения к серверам внешнего адреса IP. Это очевидно, но внешние ip-адреса постоянно меняются, поэтому для решения этой проблемы вы можете перейти на www.noip.com и создать имя, которое ссылается на ваш IP-адрес. Таким образом, в клиенте все, что вам нужно сделать, это указать имя вместо ip-адреса.

+0

Вы только что ответили на свой вопрос? – DeVadder

+0

да простите об этом. Для того же сетевого подключения я просто подключил клиента к внутреннему ip моего серверного компьютера, и он отлично работал. –

+0

ну, я все еще смущен, но если ваша проблема решена, вы должны принять либо свой собственный ответ, либо мой, если это то, что вы сделали для его решения. Если ваша проблема сохраняется, вы можете перефразировать свой вопрос. – DeVadder

1

Я думаю, ваша проблема может заключаться в том, что вы вернетесь к первой ошибке. Устранение дает вам итератор на нескольких конечных точках. Вы попробуете первый из них, и если это не сработает, вы сдаетесь вместо того, чтобы позволить итератору продолжить работу.

Опять же, я ни в коем случае не специалист по boost :: asio и гораздо меньше в своем мире TCP, но решение может вернуть более одной конечной точки (например, IPv4 и IPv6), и, возможно, только один из них не работает Вот. Для тестирования вы можете создать конечную точку самостоятельно, сначала создав ip::address объект, используя свой метод from_string() дать ему адрес сервера (работает только в локальной сети, конечно), а затем использовать его для конечной точки:

boost::asio::ip::address address; 
address.from_string("the.servers.ip.here"); 
boost::asio::ip::tcp::endpoint endpoint(address, 13); 
boost::asio::connect(socket, endpoint); 

И посмотрите, работает ли это. Если нет, это, вероятно, проблема на стороне сервера.

0

Скорее всего, проблема с брандмауэром, если вы используете окна для проверки брандмауэром окна сервера, если вы используете linux, проверьте iptables.

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