【问题标题】:Why am I not receiving UDP Packets sent to my own IP?为什么我没有收到发送到我自己 IP 的 UDP 数据包?
【发布时间】:2009-08-25 12:13:35
【问题描述】:

我已经编写了这个 ruby​​ 程序来发送一个 UDP 数据包到端口 16800:

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 中,并且我在同一台 PC(运行 Linux)上侦听端口 16800 的 UDP 服务器没有收到任何内容。

当我把程序稍微改写成

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

但是,这是从互联网的某个地方复制的,在为 stackoverflow 编辑它时,我发现服务器总是收到发送到 127.0.0.1 的数据包,但是当我将 nil 更改为“”时,服务器突然也收到了数据包上面发送的。这是 ruby​​ 套接字实现中的错误吗?

【问题讨论】:

    标签: ruby sockets udp


    【解决方案1】:

    我刚刚使用了您的代码,问题是您没有绑定到特定的 IP 地址。我不了解 Linux,但在 OS X 上存在一个问题,有时默认值会附加到未使用的 IP6 地址,而不是您期望的接口。

    在服务器上将“”更改为 192.168.1.255,并在客户端的绑定中包含“192.168.1.255”,这一切都对我有用:)

    【讨论】:

      【解决方案2】:

      UDPSocket.BIND 接受一个主机和一个端口。尝试将 nil 更改为您的 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

      【讨论】:

        【解决方案3】:

        您是否尝试发送到“localhost”或“127.0.0.1”?这将直接发送到本地计算机,并有助于进一步诊断问题。

        【讨论】:

          【解决方案4】:

          这里有点推测,但您可能需要考虑这样的事情 - 当您使用计算机自己的 IP 时,数据包在物理链路上不可见 b/c tcp/ip 堆栈不必推送为了让它们到达目的地,它可以在七层堆栈模型中的较高层之一(也许是“传输”层?)内部将它们转向计算机。

          【讨论】:

          • 我认为这只是 Windows 的问题,并且只有当您尝试在 127.0.0.1 上嗅探数据包时才会出现此问题。至少根据我的经验。
          【解决方案5】:

          如果这样的连接应该可以工作,并且您看到使用 Wireshark 的软件包,那么您还应该检查计算机上的软件防火墙。如果它阻止了到您要使用的 UDP 端口的流量,您仍然可以使用 Wireshark 查看包!

          【讨论】:

            猜你喜欢
            • 2018-08-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-03-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多