【问题标题】:Build UDP datagram in Ruby在 Ruby 中构建 UDP 数据报
【发布时间】:2013-06-07 20:30:56
【问题描述】:

在 Ruby 库或作为 Ruby gem 中是否有任何东西可以帮助我构建 UDP 数据报?我研究了套接字,但似乎没有一种方法可以简单地构建一个而不发送它。

我的用例是这样的: 我需要构建一个单独的 UDP 数据报,然后将其传递给另一个模块,该模块将负责将其发送出去。简单地说,我只需要能够指定 src/dst 地址和端口,以及有效载荷。

我想在更糟糕的情况下,我可以构建某种结构并手动填充相应的位,但这感觉就像重新发明轮子以及大量工作。套接字 API 中的底层内容应该有类似的东西,我可以使用,不是吗?

【问题讨论】:

    标签: ruby networking udp


    【解决方案1】:

    所谓的套接字 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)
    

    【讨论】:

    • 它不仅仅是一个传递的数据结构,它必须是一个正确的数据包,所有相应的 IP 和 UDP 标头位设置正确,包括长度、校验和等等。
    • @Calreth 哦,好的。我误解了你想做什么。为此,我找到了一堆你可能想看的库。它们似乎都以一种或另一种形式实现了低级数据包类,因此您可以从那里提取代码或在代码中包含最适合的库:spoofed.org/files/racket/doc | github.com/todb/packetfu | sylv1.tuxfamily.org/projects/scruby.html | sourceforge.net/apps/trac/rubypcap
    • 谢谢! :) 我能够成功地使用球拍。唯一它似乎没有做的事情(至少没有使用它来实际发送数据包)是填充短帧以满足最小以太网长度,但我能够轻松处理。
    猜你喜欢
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多