【发布时间】:2021-06-08 20:32:42
【问题描述】:
我想在 Elixir 中接收 UDP 消息,并且需要获取数据包发送到的目标 IP。
在 iex 中我可以用这个命令打开一个套接字:
{:ok, socket} = :gen_udp.open(19_999, [{:active, true}])
当我收到一条消息时,我会收到以下格式的消息:
{:udp, port, source_ip, source_port, data}
目标 IP 不是消息的一部分。根据 UDP 规范,源 IP 不是 UDP 数据包的一部分,而是 IP 伪标头的一部分。当我使用 tcpdump 时,我可以看到数据包的目标 IP。
有没有什么方法/参数可以获取UDP包的IP或者Pseudo header?
【问题讨论】:
-
我在某处读到一条评论说伪标头永远不会发送,而是用于计算校验和,这意味着您无法获取伪标头。
-
我对你的问题有点困惑。如果您的应用程序正在接收一个数据包,那么数据包的目标地址就是您的主机地址。您是否正在寻找目标地址以在收到数据包时回复?
-
我自己没用过,但是
socket模块似乎支持获取更多关于接收到的数据包的信息:erlang.org/doc/man/socket.html -
目标端口是您在
:gen_udp.open中设置的端口(代码中的19_999)。然而,目标 IP 有点棘手,因为:gen_udp.open默认侦听0.0.0.0,它指的是您所有可用的网络适配器,包括像lo这样的虚拟适配器。由于不同网络中的设备无法相互通信,也许您可以通过查看源IP来确定哪个IP地址正在接收当前数据包。