如何解决使用“ localhost”而不是“ 127.0.0.1”时,Boost :: asio async_connect无法解决
我正在编程一个tcp异步客户端,但是当我使用“ localhost”而不是“ 127.0.0.1”时,它无法连接。我的意思是127.0.0.1很好用,但是localhost异常地失败了。请帮忙解决它,或者至少对正在发生的事情有任何解释?也许我在滥用tcp :: resolver及其结果/迭代器?
PD:有趣的是,当使用同步版本进行连接时,它可以同时使用两种地址(我的意思是使用boost :: asio :: connect(socket,endpoints,error);)
#include <iomanip>
#include <iostream>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
class client
{
public:
client()
: io_context(),acceptor(io_context),socket(io_context)
{
}
void start(const char* host,const char* port)
{
tcp::resolver resolver(io_context);
tcp::resolver::results_type endpoints = resolver.resolve(host,port);//
socket.async_connect(endpoints->endpoint(),[=](boost::system::error_code error)
{
if (!error)
std::cout << "Connecting to " << host << ":" << port << "\n";
else
start(host,port);
});
}
void poll()
{
io_context.poll();
}
private:
boost::asio::io_context io_context;
tcp::acceptor acceptor;
tcp::socket socket;
};
int main(int argc,char* argv[])
{
if (argc != 1 && argc != 3)
{
std::cout << "async.exe <host> <port>" << std::endl;
return 0;
}
const char* host = (argc == 1 ? "localhost" : argv[1]);
const char* port = (argc == 1 ? "5031" : argv[2]);
try
{
std::cout << "Trying to connect to " << host << ":" << port << "...\n";
client c;
c.start(host,port);
while (true)
{
c.poll();
Sleep(100);
}
}
catch (std::exception& e)
{
std::cerr << "Exception: " << e.what() << "\n";
}
return 0;
}
非常感谢您。
解决方法
我正好有这个问题。我发现使用 localhost 和使用 IP 地址(例如 127.0.0.1 或本地机器的 IP 地址)之间的区别在于 endpoints.size() 不同。使用 IP 地址 endpoints.size() 为 1,但使用 localhost endpoints.size() 为 2。如果我随后使用调试器向下钻取,我可以看到这些端点之一的 IP 地址为 127.0.0.1,另一个具有IP 地址为 0.0.0.0。对我而言,有时端点列表工作正常,有时失败,我认为这是因为这些端点中只有一个实际上提供了可靠的路由。这很容易解决,但否则会出现奇怪的行为。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。