[ruby-list:50368] Re: [質問] Ruby socket.send でUDP Packet が出ない? ネットワーク環境によるものか?

From: <yamataka@...08.itscom.net>
Date: 2016-08-02 10:39:07 UTC
List: ruby-list #50368
市田さん

山口です。
サポートありがとうございます。

> 今日再度実行したのですが、ごく稀に成功、ほとんどが失敗という不思議な状
況
> に変わりました :(
> 
> Starting SSDP search...
> Couldn't find any UPnP devices.

今、同じ状況にはまっております。

> Wiresharkでみた時、マルチキャストパケットが発信されていないように思え
た
> ので、色々試行錯誤してみたところ、socketを作成するときにネットワークイ
ン
> タフェースを明示的に指定したところ、安定して動作するようになりました。

ご提示いただいた下記の様に、

>     def build_socket
>       socket = UDPSocket.open
>       socket.do_not_reverse_lookup = true
> 
>       mif = IPAddr.new('192.168.11.24').hton
>       socket.setsockopt(:IPPROTO_IP, Socket::IP_MULTICAST_IF, mif)
> 
>       socket.setsockopt(:IPPROTO_IP, :IP_MULTICAST_TTL, true)
>       socket.setsockopt(:SOL_SOCKET, :SO_REUSEADDR, true)
>       socket
>     end

IPアドレス部分を自IPアドレスにし、実行しましたが

yama@JPC20165182:~/.gem/ruby/gems/easy_upnp-1.1.10/bin$ ipconfig /all | 
grep -i ipv4
   IPv4 Address. . . . . . . . . . . : 192.168.0.134(Preferred)
yama@JPC20165182:~/.gem/ruby/gems/easy_upnp-1.1.10/lib/easy_upnp$ tail -
n 15 ssdp_searcher.rb
      socket = UDPSocket.open
      socket.do_not_reverse_lookup = true

      # supported by Ichida start
      mif = IPAddr.new('192.168.0.134').hton
      socket.setsockopt(:IPPROTO_IP, Socket::IP_MULTICAST_IF, mif)
      # supported by Ichida end

      socket.setsockopt(:IPPROTO_IP, :IP_MULTICAST_TTL, true)
      socket.setsockopt(:SOL_SOCKET, :SO_REUSEADDR, true)

      socket
    end
  end
end
yama@JPC20165182:~/.gem/ruby/gems/easy_upnp-1.1.10/bin$ ./upnp-list -t 
150
Starting SSDP search...
Couldn't find any UPnP devices.

の様に、市田さんの再実行時(ソフト修正前)と同じ状況になってしまいました。

Wiresharkで確認したところ、M-SEARCH Packetが出てから、約1m40s後に、
NOTIFY のPacketが届く場合もあり、
-t 150 (timeout を 150sに設定) にもしましたが、状況変わらずです。

プログラムがブロックしているので、^C しましたが、以前は出ていたトレース
も出力されなくなり…
解析がさらに難しくなってきました。

セキュリティソフト等通信に影響の出るものは無いようにしております。

他に原因を突き止める方法があれば、ご教示いただければ幸いです。

 



In This Thread