【问题标题】:sending IP address of machine to server将机器的IP地址发送到服务器
【发布时间】:2017-01-09 05:08:11
【问题描述】:

我需要以定义的时间间隔向我的一台服务器发送一个简单的请求,比如说每 2 秒一次,以便告诉我的服务器我的机器的 IP 地址(因为我有动态的 IP 地址)。我目前正在一个while循环中执行此操作,延迟std::system调用带有--silent选项的curl命令并将rest重定向到/dev/null。像这样 -

curl -s 'http://example.com' > /dev/null

服务器当前解析请求并从中找出所需的 IP 地址。有没有其他方法可以做到这一点?

【问题讨论】:

  • 查看这里:stackoverflow.com/questions/2283494/… 获取您自己的 IP 地址。然后您可以打开一个到服务器的套接字并将其发送到那里
  • 你使用什么协议?
  • 这段代码应该在你的机器而不是服务器上执行。然后它可以获取自己的 IP 地址并通过您使用的任何协议将其发送到服务器。您还可以使用 libcurl 编写执行 curl 请求的代码,而不是使用系统。
  • @Hayt 指出的代码的问题是您必须知道接口名称。更好的方法是在已经连接到服务器的套接字上使用getsockname
  • 有几种方法可以做到这一点。 Native C 将打开一个到服务器的套接字(您还需要在服务器上运行一个监听应用程序),然后您可以发送虚拟数据并解析服务器上的 IP 标头以获取发送者地址。您还可以将 IP 地址本身作为数据发送,因此您不需要解析标头。

标签: c++ http c++11 curl networking


【解决方案1】:

另一种选择是发送一个简单的 UDP 数据报包。服务器收到发件人的地址,同样可以得到。

与建立 TCP 连接相比,这需要更少的开销。当然,UDP 不能保证可传递性,偶尔会丢失一个 UDP 数据报;但由于您定期 ping 服务器应该没问题。然而,更重要的是,UDP 发送者的 IP 地址是很容易伪造的。这是否是您的应用程序的问题,只有您可以确定。

如果您要坚持使用 TCP,您可以做的一件事是自己建立一个套接字连接。让我们来看看执行system(),只是为了让curl做一个虚拟连接,涉及到:

  1. 派生一个新的子进程。

  2. 执行/bin/bash的子进程,传递给它解析的命令。

  3. Bash 读取 $HOME/.bashrc,并在其中执行任何命令。如果你的 shell 不是 bash,那么 shell 将有自己的启动脚本来执行。

  4. shell 派生出一个新的子进程。

  5. 执行curl的子进程。

  6. 加载程序找到curl 需要的所有库,并打开它们。

  7. curl 现在执行。只有这样,完成所有这些工作后,才会运行代码来打开套接字并尝试连接到远程主机。

步骤 1 到 6 可以简单地跳过,只需创建一个套接字并自己连接即可。这不是火箭科学。 socket()connect()close(),就是这样。此任务不需要 HTTP。服务器进程只需要socket()bind()listen()accept(),然后从连接中获取IP地址。完成。

【讨论】:

  • 等等,是否可以伪造 udp 数据包的 IP 地址字段?我不知道这个事实,考虑到 send() 调用仅由内核处理,这怎么可能:/
  • @hg_git 有可能欺骗任何数据,除非您对通过 ssl、tls、ipsec 等方式发送的数据使用端到端身份验证
  • 是的,伪造 udp 数据包的发送者很简单。内核提供了一个原始套接字接口,您可以使用它来发送您想要的任何数据包。
  • 您可以将 IP 存储在有效负载中并对其进行数字签名
  • @RustyX 你能提供我可以研究的任何资源来了解我应该如何进行数字签名过程:)
猜你喜欢
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-20
  • 2012-02-01
  • 2013-03-27
  • 1970-01-01
相关资源
最近更新 更多