[英]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.