【问题标题】:How can I limit a boost asio acceptor to localhost and/or local networks?如何将 boost asio 接受器限制为 localhost 和/或本地网络?
【发布时间】:2016-04-06 09:26:50
【问题描述】:

我试图弄清楚如何将 tcp 套接字限制为 localhost。我终于找到了可以编译的代码,但它不接受任何连接。

代码接受与endpoint_all的连接,但不接受用tcp::endpoint(ip::address::from_string("127.0.0.1"),port2);设置的“endpoint_local”变量;

boost::asio::io_service io_service;
short port = 9000;
tcp::endpoint endpoint_all   = boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(),port);
tcp::endpoint endpoint_local = boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("127.0.0.1"),port);
try
{
    server s(io_service, std::atoi("9000"),endpoint_all);

    io_service.run();
}
catch (std::exception& e)
{
}

更新:我可以通过“telnet 127.0.0.1 9000”和“telnet localhost 9000”访问套接字。有问题的实际应用程序(PHP XDebug)不会连接到 ip 受限端点,但会以其他方式连接。

"telnet localhost 9000" 给出以下错误,但确实连接。我没有在 php.ini 中连接本地主机,但也许这条消息是相关的。 "连接被拒绝 ::1:"

我认为允许连接到 ::1: 是合适的,无论这是否是错误。

Trying ::1...
telnet: connect to address ::1: Connection refused
Trying fe80::1...
telnet: connect to address fe80::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.

【问题讨论】:

    标签: c++ sockets boost tcp


    【解决方案1】:

    从错误消息“Connection denied for ::1”来看,PHP XDebug 似乎试图连接到::1,这是127.0.0.1 的 IPv6 等价物。

    将此地址交给 asio 以监听 IPv6 连接:

    tcp::endpoint endpoint_local = tcp::endpoint(boost::asio::ip::address::from_string("::1"),port);
    

    【讨论】:

    • 不幸的是,我被 php.ini 中的错误注释行愚弄了。它是通过虚拟IP连接的。我应该先检查 XDebug 日志。
    【解决方案2】:

    这样做

    boost::asio::ip::tcp::resolver resolver(io_service);
    
    resolver.async_resolve({"localhost", std::to_string(port).data()}, [self{shared_from_this()}](auto ec, auto res) {
        if(ec || res.empty()) {
            return;
        }
        auto endpoint = boost::asio::ip::tcp::endpoint(*res.begin());
    });
    

    【讨论】:

      猜你喜欢
      • 2021-09-20
      • 1970-01-01
      • 2011-05-10
      • 2018-06-08
      • 2016-02-13
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      相关资源
      最近更新 更多