C++ boost::asio 无法建立连接,因为目标机器主动拒绝它

Posted

技术标签:

【中文标题】C++ boost::asio 无法建立连接,因为目标机器主动拒绝它【英文标题】:C++ boost::asio no connection could be made because the target machine actively refused it 【发布时间】:2015-12-06 23:11:20 【问题描述】:

这不是重复的! (这不是关于 UDP,而是 TCP。这不是 C#、Python 或其他什么,它是 C++)

如果我尝试通过我的外部 IP 连接,则会收到标题中描述的错误。但是,它通过“localhost”或“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;

【问题讨论】:

检查计算机的防火墙设置 我在发布这个帖子之前已经尝试过了。它不起作用。 这个answer 可能会有所帮助。特别是,可能需要调查路由设备的功能/配置(环回和端口转发)。 尝试写“127.0.0.1”而不是“localhost” @pogorskiy 该代码适用于 localhost 和 127.0.0.1。问题是外部 IP。 【参考方案1】:

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

只要请求不是来自我的本地网络,客户端就会毫无问题地连接到服务器。

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

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

我从未见过这种情况发生。但至少不会影响我程序的功能。

【讨论】:

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

以上是关于C++ boost::asio 无法建立连接,因为目标机器主动拒绝它的主要内容,如果未能解决你的问题,请参考以下文章

C++ boost::asio https 通过代理

C++ Boost asio (OpenSSL) 获取活动连接的密码和 TLS/SSL 版本

boost::asio 无法干净地关闭 TCP 连接

使用 C++ 和 Boost::Asio 的 N 方客户端到客户端通信

是啥导致了 boost C++ asio 中的 asio.misc.3 错误

c++ - Boost ASIO 网络服务器/客户端