传递变量或放置具有相同内容的 ip 字符串时,asio 客户端应用程序会产生不同的结果
Different results in asio client application when passing a variable or putting an ip string with the same content
有些事情我想不通。
以下是来自 boost asio 的聊天客户端示例的部分代码:https://www.boost.org/doc/libs/1_70_0/doc/html/boost_asio/example/cpp11/chat/chat_client.cpp
int Tcp::client(std::string peer_ip)
{
try
{
boost::asio::io_context io_context;
tcp::resolver resolver(io_context);
auto endpoints = resolver.resolve(peer_ip, "1975");
chat_client c(io_context, endpoints);
std::thread t([&io_context]() { io_context.run(); });
char line[chat_message::max_body_length + 1];
while (std::cin.getline(line, chat_message::max_body_length + 1))
{
chat_message msg;
msg.body_length(std::strlen(line));
std::memcpy(msg.body(), line, msg.body_length());
msg.encode_header();
c.write(msg);
}
c.close();
t.join();
}
catch (std::exception &e)
{
std::cerr << "Exception: " << e.what() << "\n";
}
return 0;
}
当 peer_ip 变量如上所述传递给解析器时,我得到:
异常:解析:找不到主机(权威)
auto endpoints = resolver.resolve(peer_ip, "1975");
如果 ip 地址的字符串如下所示,则客户端工作并与服务器通信。
auto endpoints = resolver.resolve("13.58.174.105", "1975");
我也尝试传递一个 const 变量和一个引用,使变量成为 std::move,但不知何故我的努力没有奏效。
你知道问题出在哪里,我应该怎么做吗?
TIA,
妮可
std::string Tcp::client(std::string peer_ip) { try { boost::asio::io_context io_context; tcp::resolver解析器(io_context);自动端点 = resolver.resolve(peer_ip, "1975"); p2p_client c(io_context, 端点); std::thread t(&io_context { io_context.run(); });字符行[chat_message::max_body_length + 1]; while (std::cin.getline(line, chat_message::max_body_length + 1)) { chat_message msg; msg.body_length(std::strlen(行)); std::memcpy(msg.body(), 行, msg.body_length()); msg.encode_header(); c.write(消息); } c.close(); t.join(); } catch (std::exception &e) { std::cerr << "异常:" << e.what() << "\n"; } return 0; } peer_ip
peer_ip
变量的值是多少?如果它也是“13.58.174.105”那么那就奇怪了。
否则就是主机名无法解析为IP地址
如果已知 peer_ip
始终包含 IP 地址,则 无论如何都不需要解析任何内容,您可以 解析 地址改为:
std::string peer_ip = "127.0.0.1";
tcp::endpoint endpoint {
boost::asio::ip::address_v4::from_string(peer_ip.c_str()), 1975 };
有些事情我想不通。
以下是来自 boost asio 的聊天客户端示例的部分代码:https://www.boost.org/doc/libs/1_70_0/doc/html/boost_asio/example/cpp11/chat/chat_client.cpp
int Tcp::client(std::string peer_ip)
{
try
{
boost::asio::io_context io_context;
tcp::resolver resolver(io_context);
auto endpoints = resolver.resolve(peer_ip, "1975");
chat_client c(io_context, endpoints);
std::thread t([&io_context]() { io_context.run(); });
char line[chat_message::max_body_length + 1];
while (std::cin.getline(line, chat_message::max_body_length + 1))
{
chat_message msg;
msg.body_length(std::strlen(line));
std::memcpy(msg.body(), line, msg.body_length());
msg.encode_header();
c.write(msg);
}
c.close();
t.join();
}
catch (std::exception &e)
{
std::cerr << "Exception: " << e.what() << "\n";
}
return 0;
}
当 peer_ip 变量如上所述传递给解析器时,我得到: 异常:解析:找不到主机(权威)
auto endpoints = resolver.resolve(peer_ip, "1975");
如果 ip 地址的字符串如下所示,则客户端工作并与服务器通信。
auto endpoints = resolver.resolve("13.58.174.105", "1975");
我也尝试传递一个 const 变量和一个引用,使变量成为 std::move,但不知何故我的努力没有奏效。
你知道问题出在哪里,我应该怎么做吗?
TIA,
妮可
std::string Tcp::client(std::string peer_ip) { try { boost::asio::io_context io_context; tcp::resolver解析器(io_context);自动端点 = resolver.resolve(peer_ip, "1975"); p2p_client c(io_context, 端点); std::thread t(&io_context { io_context.run(); });字符行[chat_message::max_body_length + 1]; while (std::cin.getline(line, chat_message::max_body_length + 1)) { chat_message msg; msg.body_length(std::strlen(行)); std::memcpy(msg.body(), 行, msg.body_length()); msg.encode_header(); c.write(消息); } c.close(); t.join(); } catch (std::exception &e) { std::cerr << "异常:" << e.what() << "\n"; } return 0; } peer_ip
peer_ip
变量的值是多少?如果它也是“13.58.174.105”那么那就奇怪了。
否则就是主机名无法解析为IP地址
如果已知 peer_ip
始终包含 IP 地址,则 无论如何都不需要解析任何内容,您可以 解析 地址改为:
std::string peer_ip = "127.0.0.1";
tcp::endpoint endpoint {
boost::asio::ip::address_v4::from_string(peer_ip.c_str()), 1975 };