2009-08-25 62 views
0

我寫這個Ruby程序發送一個UDP數據包到端口16800:爲什麼我沒有收到發送到我自己的IP的UDP包?

require 'socket' 
sock = UDPSocket.new 
sock.bind("", 47123) 
sock.send("Hello!", 0, "192.168.0.100", 16800) 
sock.close 

其中192.168.0.100是我自己的IP地址。但是,數據包不會顯示在Wireshark中,我的UDP服務器在同一臺PC(運行Linux)上偵聽端口16800時沒有收到任何內容。

當我稍微程序改寫爲

require 'socket' 
sock = UDPSocket.new 
sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, true) 
sock.bind("", 47123) 
sock.send("Hello!", 0, "<broadcast>", 16800) 
sock.close 

了數據包在Wireshark的顯示出來,但我的服務器仍然沒有收到任何東西。

我錯過了一些明顯的東西嗎?

編輯: 服務器代碼,完整性

require 'socket' 
sock = UDPSocket.new 
sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, true) 
sock.bind(nil, 16800) 
while true 
    packet = sock.recvfrom(1024) 
    puts packet 
end 

然而,這地方從互聯網上,並在編輯它計算器複製,我發現服務器總是收到發往127.0包。 0.1但是當我改變爲「」時,服務器突然也收到上面發送的數據包。這是在ruby套接字實現中的錯誤嗎?

+1

嘗試127.0.0.1? – 2009-08-25 12:15:16

回答

0

您是否嘗試發送到「本地主機」或「127.0.0.1」?這將直接發送到本地計算機,並有助於進一步診斷問題。

1

UDPSocket.BIND需要一個主機和一個端口。嘗試將零修改爲您的IP地址。來自http://coderrr.wordpress.com/2008/05/28/get-your-local-ip-address/;使用

require 'socket' 

def local_ip 
    orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true # turn off reverse DNS resolution temporarily 

    UDPSocket.open do |s| 
    s.connect '64.233.187.99', 1 
    s.addr.last 
    end 
ensure 
    Socket.do_not_reverse_lookup = orig 
end 

,讓您的IP

0

一種推測這裏,但你可能要考慮這樣的事情 - 當你使用計算機自己的IP,數據包不會在物理鏈路B可見/ c tcp/ip協議棧不需要將它們推到那個位置,就可以將它們轉到內部的計算機上,在7層堆棧模型中的更高層之一(「傳輸'層,也許?)

+0

我認爲這只是Windows的問題,並且只有當您試圖在127.0.0.1上嗅探數據包時。至少在我的經驗。 – MattC 2009-08-25 13:18:26

1

我剛剛使用你的代碼,問題是你沒有綁定到特定的IP地址。我不知道Linux,但是在OS X上有一個問題,有時默認會附加到未使用的IP6地址,而不是您期望的接口。

更改「」到192.168.1.255的服務器上,幷包括「在客戶端綁定192.168.1.255」做這些工作對我來說:)

0

如果這樣的連接應該工作,並你看到使用Wireshark的軟件包,那麼你也應該檢查你的機器上的軟件防火牆。如果它阻塞了要使用的UDP端口的流量,您仍然可以使用Wireshark查看該包。

相關問題