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

C++ C++;boost::asio无法建立连接,因为目标计算机主动拒绝了它,c++,boost,boost-asio,C++,Boost,Boost Asio,这不是复制品!(这不是关于UDP,而是TCP。这不是C#、Python或其他东西,而是C++) 如果我尝试通过外部IP连接,则会出现标题中描述的错误。但是,它通过“localhost”或“127.0.0.1”工作(我在同一台机器上运行client.exe和server.exe)。这段代码是从一个示例中复制的,我做了一些小改动 编辑:我对这两个可执行文件都授予了防火墙权限。但问题依然存在 服务器: #include <ctime> #include <iostream> #

这不是复制品!(这不是关于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;
 }
#包括
#包括
#包括
#包括
使用boost::asio::ip::tcp;
std::string make_days_string()
{
使用命名空间std;//表示时间、时间和ctime;
现在时间=时间(0);
返回ctime(&now);
}
int main()
{
尝试
{
boost::asio::io_服务io_服务;
tcp::acceptor acceptor(io_服务,tcp::endpoint(tcp::v4(),62000));
对于(;;)
{
tcp::套接字(io_服务);
接受(套接字);
std::string message=make_days_string();
boost::system::error\u代码被忽略\u错误;
boost::asio::write(套接字,boost::asio::buffer(消息),忽略\u错误);
}
}
捕获(标准::异常&e)
{

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

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

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

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


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

检查计算机的防火墙设置我在发布此线程之前已经尝试过了。它不起作用。这可能会有帮助。特别是,可能需要调查路由设备的功能/配置(环回和端口转发)。请尝试编写“127.0.0.1”而不是“localhost”@pogorskiy该代码同时适用于localhost和127.0.0.1。问题是外部IP。您可能需要澄清“外部”IP是什么。您是指ISP分配的公共IPv4地址,还是192.168.x.x/10.x.x.x本地网络地址?您的路由器不关心后者。
#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;
}