【问题标题】:C++ How to get Hostname from Http GET packetC ++如何从Http GET数据包中获取主机名
【发布时间】:2011-11-19 03:58:57
【问题描述】:

我想使用从如下所示的数据包中获得的信息创建到 Web 服务器的 tcp 连接。为此,我需要数据包中的主机名和端口号来获取可用于连接功能的地址

这是假设我使用的是 c++ 我可以假设与服务器交谈以请求 html 页面的端口号是 80 吗? 假设数据包是 char 数组的形式,我如何从数据包中获取主机名?我目前提取字符串 bits.wikimedia.org 并将其用作主机名。那是对的吗? 一旦我有了主机名,我假设我将它传递给 getaddrinfo 并使用我与这个函数一起传递的结构来生成一个包含连接函数可以理解的信息的结构。这个假设正确吗?

GET http://bits.wikimedia.org/en.wikipedia.org/load.php?debug=false&lang=en&modules=site&only=scripts&skin=vector&* HTTP/1.1
Host: bits.wikimedia.org
Proxy-Connection: close
User-Agent: Mozilla/5.0 (compatible; Konqueror/4.6; Linux) KHTML/4.6.5 (like Gecko) Fedora/4.6.5-7.fc15
Referer: http://en.wikipedia.org/wiki/Firewall_(computing)
Accept: */*
Accept-Encoding: x-gzip, x-deflate, gzip, deflate
Accept-Charset: utf-8, utf-8;q=0.5, *;q=0.5
Accept-Language: en-US,en;q=0.9

【问题讨论】:

    标签: c++ http packet hostname


    【解决方案1】:

    如果您收到一个包含字符串/字符数组的离线 http 数据包,那么您只需要依赖字符串中的 URL。 HTTP URL 以 http://hostname[:port]/resource... 格式指定,其中端口号是可选的,如果未指定,则默认为 http 端口 80。您需要解析 URL 以提取主机名和端口号 [假设端口 80,如果未明确指定] 并尝试套接字连接。您需要设置您的 DNS 并且可以从您的程序访问,以便将主机名解析为其 IP 地址。没有这个,您将无法建立连接。

    【讨论】:

      【解决方案2】:

      您应该能够依靠 Host: header field 来获得主机名。

      查看链接以了解其格式。您需要逐行阅读标题,识别“主机:”行,提取以下字符串,如果给定(主机:端口),可能提取端口号。

      是的,getaddrinfo() 可用于获取主机名的 IP 地址。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-29
        • 2013-11-01
        • 2020-03-11
        • 2021-06-04
        • 2012-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多