解决方法:没有这样的主机是已知的?

问题描述:

我在尝试使用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/“包含无效字符,并且可能无法解析。有关更多详细信息,请参阅RFC952RFC1123

+0

感谢您的反馈意见。 我已经尝试解析主机名 - “172.34.22.11”,并且工作正常。 但我的要求是发送一些数据到/测试/,在这种情况下,我需要获得完整的URL“http://172.34.22.11/test/”。 那我该怎么做?如果你能指导我正确的方向,这将是非常有用的,因为我是网络领域的新手。 – harry

+0

此外,虽然通过stackoverflow帖子看,我发现每一个建议使用POCO或CURL库进行HTTP/HTTPS连接/数据传输。那么这是否意味着提升对HTTP不是一个好的选择?由于我在我的应用程序中使用boost来提供其他purppose,因此我还认为它也用于HTTP通信。 – harry

+0

@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)将是一个好主意。 –