2015-12-06 54 views
1

这不是重复的! (这不是关于UDP,它是TCP,这不是C#,Python或其他,它是C++)C++ boost :: asio无法连接,因为目标机器主动拒绝它

如果我试图通过我的外部IP连接,我得到标题中描述的错误。但是,它通过“本地主机”或“127.0.0.1”(我在同一台机器上运行client.exe和server.exe)工作。这段代码是从一个例子中复制出来的,我做了一些小改动。

编辑:我给了两个可执行文件的防火墙权限。但问题仍然存在。

服务器:

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

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

std::string make_daytime_string() 
{ 
    using namespace std; // For time_t, time and ctime; 
    time_t now = time(0); 
    return ctime(&now); 
} 

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

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


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

     std::string message = make_daytime_string(); 

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

客户:

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

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

int main(int argc, char* argv[]) 
{ 
    try 
    { 
    boost::asio::io_service io_service; 
    tcp::resolver resolver(io_service); 
    tcp::resolver::query query("localhost", "62000"); 
    tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); 

    tcp::endpoint endpoint = *endpoint_iterator; 
    std::cout << endpoint << "\n\n"; 

    tcp::socket socket(io_service); 

    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); 
    } 
    } 
    catch (std::exception& e) 
    { 
    std::cerr << e.what() << std::endl; 
    } 

    std::cout << "\n\n"; 
    system("pause"); 
    return 0; 
} 
+1

检查计算机的防火墙设置 –

+0

在发布此线程之前,我曾尝试过。它不起作用。 – bitcode

+1

This [answer](http://stackoverflow.com/a/15036553/1053968)可能会有所帮助。特别是,可能需要调查路由设备的功能/配置(回送和端口转发)。 –

回答

3

原来我的路由器将不接受来自Internet的连接(使用外部IP)如果请求来自于我的本地网络。

只要请求不是来自我的本地网络,客户端将连接到服务器没有问题。

如果我想在我的机器上运行客户端和服务器,我必须使用我的内部IP(127.0.0.1或我的内部网络IP)。

如果有人想从我的本地网络外部连接到我的服务器,它将正常工作。但是我的本地网络中的机器将无法使用外部IP访问服务器,只能使用内部IP。

我从来没有见过这种情况。但至少它不影响我的程序的功能。

+0

你可能想澄清你的“外部”IP是什么。你是指ISP分配的公共IPv4地址,还是192.168.x.x/10.x.x.x本地网络地址?你的路由器不关心后者。 – MSalters

相关问题