Ruby 库或 Ruby gem 中是否有任何东西可以帮助我构建 UDP 数据报?我已经研究过套接字,但似乎没有一种方法可以简单地构建一个而不发送它。
我的用例是这样的:我需要构建一个 UDP 数据报,然后将其传递给另一个模块,该模块将负责将其发送出去。简单地说,我只需要能够指定 src/dst 地址和端口,以及有效负载。
我想在更糟糕的情况下,我可以构建某种结构并手动填充相应的位,但这感觉就像重新发明轮子以及大量工作。套接字 API 中的底层内容应该有类似的东西,我可以使用,不是吗?
Ruby 库或 Ruby gem 中是否有任何东西可以帮助我构建 UDP 数据报?我已经研究过套接字,但似乎没有一种方法可以简单地构建一个而不发送它。
我的用例是这样的:我需要构建一个 UDP 数据报,然后将其传递给另一个模块,该模块将负责将其发送出去。简单地说,我只需要能够指定 src/dst 地址和端口,以及有效负载。
我想在更糟糕的情况下,我可以构建某种结构并手动填充相应的位,但这感觉就像重新发明轮子以及大量工作。套接字 API 中的底层内容应该有类似的东西,我可以使用,不是吗?
所谓的套接字 API 本质上是一个非常低级的 C 语言 API。创建 UDP 套接字时,连接信息存储在内核中。您永远不会“构建 UDP 数据报”,而是将数据写入 UDP 套接字文件描述符,然后在内核中构建要通过线路发送的物理数据包。
所以是的,如果你想要一个可以在应用程序中传递的数据结构,其中包含目标地址和一些数据,那么你需要自己创建这个结构,因为它在其他任何地方都不存在。
这不是很多工作。只有两个(或三个)数据元素。您可以使用简单Struct
的方法来完成这项工作,除非您需要更精细的功能,然后您只需构建一个普通的类。
编辑
看来我误解了你的问题。有关资源,请参阅下面的评论。例如,这里有一些来自Racket library docs的代码,它可能更接近您正在寻找的内容:
# tack on UDP
n.l4 = UDP.new
# randomize source port
n.l4.src_port = 1024 + rand(65535-1024)
# take destination port from the commandline
n.l4.dst_port = ARGV[2].to_i
# build a random amount of garbage for the payload
n.l4.payload = Misc.randstring(ARGV[3].to_i)
# fix 'er up (checksum, length) prior to sending
n.l4.fix!(n.l3.src_ip, n.l3.dst_ip)