2013-06-06 45 views
2

Ruby庫或Ruby gem中是否有任何幫助我構建UDP數據報的東西?我已經研究過套接字,但似乎沒有辦法簡單地構建一個而不發送它。我的用例是這樣的: 我需要構建一個UDP數據報,然後將它傳遞給另一個模塊,它將負責將其發送出去。簡而言之,我只需要能夠指定src/dst地址和端口以及有效載荷。在Ruby中構建UDP數據報

我想在最壞的情況下,我可以建立某種結構並手動填充各個位,但感覺像重新發明輪子以及大量工作。套接字API中的底層東西應該有類似的東西,我可以利用它,不是嗎?

回答

2

所謂的套接字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) 
+0

它不只是簡單的多數民衆贊成雖然通過圍繞一個數據結構,它必須是一個正確的數據包,所有的各自IP和UDP報頭比特設置正確,包括長度,校驗和等等。 – hitsuyashi

+0

@ Calreth哦,好的。我誤解了你想要做的事情。爲此,我找到了一堆你可能想看的庫。它們似乎都以某種形式實現低級數據包類,因此您可以從那裏提取代碼或在代碼中包含最適合的庫:http://spoofed.org/files/racket/doc/ | https://github.com/todb/packetfu | http://sylv1.tuxfamily.org/projects/scruby.html | http://sourceforge.net/apps/trac/rubypcap/ – Casper

+0

謝謝! :)我能夠成功地利用球拍。只有它似乎沒有做的事情(至少不用它來真正發送數據包)是填充短幀以滿足最小的以太網長度,但我能夠輕鬆地處理這一點。 – hitsuyashi