2013-12-10 2 views
0

메신저 부스트 공식 웹 사이트 http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/tutorial/tutdaytime1.html의 자습서를 따르십시오.Boost.asio server-client. 2 대의 컴퓨터를 연결하십시오

동일한 컴퓨터에서 "localhost"또는 "127.0.0.1"에 연결하면 프로그램이 제대로 작동합니다. 하지만 같은 네트워크에있는 다른 컴퓨터에서 클라이언트를 실행하면 서버에 연결되지 않습니다. 왜 이런 일이 일어나는 걸까요? 클라이언트를 다른 네트워크에서 실행하려면 어떻게해야합니까?

오류 : 연결 : 대상 컴퓨터가 적극적으로 거부했기 때문에 연결할 수 없습니다.

클라이언트 :

#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

첫 번째 오류로 돌아 오는 것일 수 있습니다. Resolving은 여러 엔드 포인트에서 반복자를 제공합니다. 당신은 그것들 중 첫 번째 것을 시도하고 그것이 효과가 없다면 당신은 반복자를 계속하는 대신 포기합니다.

다시 말하지만, 나는 boost :: asio의 전문가이며 TCP 세계에서는 훨씬 적지 만 해결은 하나 이상의 끝점 (예 : IPv4 및 IPv6)을 반환 할 수 있으며 그 중 하나만 작동하지 않을 수 있습니다 이리.

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); 
: 먼저 그것을 서버의 주소를 제공하기 위해 from_string() 방법을 사용하여 ip::address 객체를 생성하여 엔드 포인트를 직접 만들 수 있습니다 테스트를위한 은 엔드 포인트를 위해 그것을 사용하여 다음과 (현지 물론 네트워크에서만 작동)

작동하는지 확인하십시오. 그렇지 않은 경우 서버 측에서 문제 일 수 있습니다.

0

방화벽 문제 일 가능성이 높습니다. 서버 검사 창에 방화벽을 사용하는 경우 방화벽을 사용하고 Linux를 사용하는 경우 iptables를 확인하십시오.

관련 문제