解决方法:没有这样的主机是已知的?
问题描述:
我在尝试使用C++中的boost解析器解析端点时遇到了一个奇怪的问题。解决方法:没有这样的主机是已知的?
案例: 我试图连接到一个网站http://localhostIpAddress/test/使用boost。 服务器的本地地址是“172.34.22.11”(比如说)。
我对着错误说“决心:没有这样的主机被称为”
但是,当我连接到网站说如google.com它能够解决和连接成功。 另外,即使我尝试在浏览器中打开“http :: // localhostIpAddress/test /”,它也会成功打开。下面
是我的代码:
int main()
{
std::cout << "\nWebClient is starting... \n";
boost::asio::io_service IO_Servicehttp;
boost::asio::ip::tcp::resolver Resolverhttp(IO_Servicehttp);
std::string porthttp = "http";
boost::asio::ip::tcp::resolver::query Queryhttp("172.34.22.11/test/", porthttp);
boost::asio::ip::tcp::resolver::iterator EndPointIteratorhttp = Resolverhttp.resolve(Queryhttp);
g_ClientHttp = new HTTPClient(IO_Servicehttp, EndPointIteratorhttp);
}
catch (std::exception& e)
{
std::cerr << e.what();
}
}
在HTTPClient.cpp
HTTPClient::HTTPClient(boost::asio::io_service& IO_Servicehttp, boost::asio::ip::tcp::resolver::iterator EndPointIterhttp)
: m_IOServicehttp(IO_Servicehttp), m_Sockethttp(IO_Servicehttp),m_EndPointhttp(*EndPointIterhttp)
{
std::cout << "\n Entered: HTTPClient ctor \n";
boost::asio::ip::tcp::resolver::iterator endhttp;
boost::system::error_code error= boost::asio::error::host_not_found;
try
{
while (error && EndPointIterhttp != endhttp) //if error go to next endpoint
{
m_Sockethttp.async_connect(m_EndPointhttp,boost::bind(&HTTPClient::OnConnect_http, this, boost::asio::placeholders::error, ++EndPointIterhttp));
}
if(error)
throw boost::system::system_error(error);
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
m_IOServicehttp.run();
}
我已经经历了很多网站由谷歌直接的走了,但还没有找到与此相关的任何问题。 任何帮助或建议将不胜感激
答
被解析的主机名是无效的。尝试将解析器的查询主机更改为“172.34.22.11”。在URL中, “http://172.34.22.11/test/”:
- “HTTP” 是协议
- “172.34.22.11” 是一个需要解决的主机
- “/测试/ “是路径
在高层次上,客户端和服务器(主机)之间通过TCP进行网络通信。客户端将创建一个HTTP请求,将该路径包含为请求的一部分,并将完整请求写入TCP套接字。服务器将从TCP套接字读取HTTP请求,根据路径处理请求,然后通过TCP向客户端写入HTTP响应。
主机名被串接用点和指定为仅允许:
- ASCII字母 'a' 到 'z'
- 数字
- 连字符
因此,“ 172.34.22.11/test/“包含无效字符,并且可能无法解析。有关更多详细信息,请参阅RFC952和RFC1123。
感谢您的反馈意见。 我已经尝试解析主机名 - “172.34.22.11”,并且工作正常。 但我的要求是发送一些数据到/测试/,在这种情况下,我需要获得完整的URL“http://172.34.22.11/test/”。 那我该怎么做?如果你能指导我正确的方向,这将是非常有用的,因为我是网络领域的新手。 – harry
此外,虽然通过stackoverflow帖子看,我发现每一个建议使用POCO或CURL库进行HTTP/HTTPS连接/数据传输。那么这是否意味着提升对HTTP不是一个好的选择?由于我在我的应用程序中使用boost来提供其他purppose,因此我还认为它也用于HTTP通信。 – harry
@harry如果目的是通过编写HTTP客户端来了解协议,那么[Asio HTTP客户端示例](http://www.boost.org/doc/libs/1_60_0/doc/html/ boost_asio/examples/cpp03_examples.html#boost_asio.examples.cpp03_examples.http_client)可能是一个很好的开始,并且可以帮助理解HTTP请求是如何发送给主机而不是URL的。另一方面,如果只需要通过HTTP进行通信,那么使用经过充分测试的,成熟的现有URL库(如libcurl)将是一个好主意。 –