C TCP套接字 - 获取数据包目标名称

时间:2014-11-03 22:21:15

标签: c linux sockets networking tcp

此时这是更假设的,但我要说我在Linux上运行用C编写的TCP服务器。是否可以从单个数据包中获取目标名称?例如,如果客户端连接,我的服务器位于www.example.com。我希望能够获得" www.example.com"来自传入的数据包。

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

让多个服务在同一台机器上运行并可通过同一端口访问将是很好的:443,但能够通过域名分隔。如果我可以从数据包中获取目的地名称,我很确定我可以很容易地写出这样的东西。

- 修改 我做了一些研究但是空洞了。我已经查看过我之前编写过的服务器,但我不认为我可以使用现有的Linux套接字层来完成它。我可能不得不低于此。

3 个答案:

答案 0 :(得分:2)

不,因为永远不会发送目标主机名。

发件人使用DNS查找要与之通信的主机的IP地址,然后将数据包发送到该IP地址。 (更低级别,IP地址转换为MAC地址,这是硬件层使用的)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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