【问题标题】:C TCP Socket - Get packet destination nameC TCP Socket - 获取数据包目的地名称
【发布时间】:2014-11-03 22:21:14
【问题描述】:

目前这只是假设性的,但假设我有一个用 C 语言编写的 TCP 服务器,在 Linux 上运行。是否可以从单个数据包中获取目标名称?例如,如果客户端连接并且我的服务器位于 www.example.com。我希望能够从传入的数据包中获取“www.example.com”。

我的最终目标是按目标名称分隔网络流量,类似于 IIS 在 Windows 上使用网站绑定的方式。

如果可以在同一台机器上运行多个服务并且可以通过相同的端口访问:443,但可以通过域名分隔。如果我可以从数据包中获得目标名称,我很确定我可以相当容易地编写这样的东西。

--编辑 我做了一些研究,但结果是空的。我查看了我以前编写的服务器,我认为我不能使用现有的 Linux 套接字层来做到这一点。我可能不得不比那更低。

【问题讨论】:

    标签: c linux sockets networking tcp


    【解决方案1】:

    不,因为从未发送过目标主机名。

    发送者使用 DNS 找到它想与之通信的主机的 IP 地址,然后向该 IP 地址发送一个数据包。 (更底层,IP地址被翻译成MAC地址,这是硬件层使用的)

    您的 TCP 套接字层应该允许您查看套接字的源 IP 地址和目标 IP 地址,然后您必须进行反向 DNS 查找以将其转换回主机名。但请记住,一个 IP 地址可以转换为多个主机名...

    【讨论】:

    • “IP 地址可以转换为多个主机名”..这就是问题所在。如果我有 test.example.com 和 test2.example.com,我无法进行反向 DNS 查找并获取原始地址所在的域。感谢您的详细回复。
    • @tier1 没错。您需要使用显式发送主机名的协议,就像 HTTP 一样。 en.wikipedia.org/wiki/Hypertext_Transfer_Protocol
    【解决方案2】:

    如果你有一个用 C 语言编写的 Linux TCP 服务器,那么在某种程度上它会使用accept() 系统调用来接受传入的连接。一旦建立连接,从其相应套接字接收和发送到其相应套接字的所有数据包都与同一远程计算机相关联。该远程计算机的地址通过该调用的第二个参数提供给accept() 调用者。

    您可以通过gethostbyaddr() 查找地址。

    【讨论】:

      【解决方案3】:

      如果客户端使用的协议支持这一点,那么它是可能的。如果没有,那是不可能的。 TCP 没有提供任何方法来获取客户端最初尝试访问的主机名,但其他一些协议(例如 HTTP 和 TLS)可以。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-09
        • 2012-08-02
        • 2015-12-21
        • 1970-01-01
        • 2012-12-02
        • 2010-10-10
        • 1970-01-01
        • 2020-08-24
        相关资源
        最近更新 更多