簡體   English   中英

如何將 boost asio 接受器限制為本地主機和/或本地網絡?

[英]How can I limit a boost asio acceptor to localhost and/or local networks?

我想弄清楚如何將 tcp 套接字限制為本地主機。 我終於找到了可以編譯的代碼,但它不接受任何連接。

該代碼接受與 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.

從錯誤消息“Connection refused for ::1”來看,PHP XDebug 似乎試圖連接到::1 ,它是127.0.0.1的 IPv6 等價物。

將此地址傳遞給 boost asio 以監聽 IPv6 連接:

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

那樣做

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM