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

From: <yamataka@...08.itscom.net>
Date: 2016-08-04 08:53:35 UTC
List: ruby-list #50370
市田さん

山口です。

ずっとサポートいただき、大変感謝しております。

> 何点か気になる点があります。

いただいたアドバイスや確認の順番が、前後しますが

> 2. 利用環境について
> プロンプトがWindowsの標準のコマンドプロンプトではないですね。
> rubyも含めcygwinでしょうか。

はい。Cygwinを利用しております。

Windows 8.1 Enterprize 64bit
yama@JPC20165182:~$ uname -a
CYGWIN_NT-6.3 JPC20165182 2.5.2(0.297/5/3) 2016-06-23 14:29 x86_64 
Cygwin
yama@JPC20165182:~$ ruby -v
ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-cygwin]
yama@JPC20165182:~$ gem list | grep easy_upnp
easy_upnp (1.1.10)
yama@JPC20165182:~$ ipconfig | grep IPv4
   IPv4 Address. . . . . . . . . . . : 192.168.0.134
yama@JPC20165182:~$ tail -n 16 ~/.gem/ruby/gems/easy_upnp-1.1.10/lib/
easy_upnp/ssdp_searcher.rb
    def build_socket
      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

市田さんご提示のソース変更部分を、オリジナルソースに反映しております。

> 1. 現象について

> 「ブロック」と表現されているのですが、該当スクリプトではタイムアウトを
検
> 出するようになっているので、デバイスからの応答を受け取れない場合、
> Couldn't find any UPnP devices.
> と表示して終了することになり、ブロックしたままになることはないはずです。
> 設定したタイムアウト時間が経過してもこの表示が出ず、動作がブロックして
い
> るのであれば、タイムアウト検知がうまく働かない状況で、少なくとも私のと
こ
> ろとは別の現象が発生しています。

Souce内で、Timeout値 2 (2s)を設定されているにもかかわらず、Timeoutせずに、
プロンプトに
戻らないので、^C で強制終了させています。
動作的気になっていましたが、recv内でブロックしている認識だったので、正確
に伝えきれていなくてすみません。

> 4. Windowsのサービス設定
> WindowsのSSDPサービスは有効でしょうか。
> 私の環境ではSSDPサービスが有効だとスクリプトが動作しますが、無効にする
> と、Host Unreachable となって、そもそも送信できなくなります。

ファイル名を指定して実行 -> msconfig
システム構成 "サービス" タブにて、SSDP Discovery 実行中 を確認しました。
ですので、有効になっております。

> 3. Wifiルータについて
> Wifiルータに直接接続ということですが、スイッチングハブで有線接続してみ
て
> 状況は変わるでしょうか。
> 変わるようであればWifiルートが影響している可能性があります。
> 別のソフトでは問題なく動作しているということなので、可能性は低いかもし
れませんが。

症状変わらずです。

一旦、Cygwinの環境ではなく、
Windows版 Ruby ruby 2.3.1p112 (2016-04-26 revision 54768) [x64-mingw32]
で試すことにしました。

easy_upnp gem をWindows版Ruby環境にインストール(cygwin gem path)
ssdp_search.rb 市田さんの修正を適用し、upnp-list 実行したところ、
Cygwin版でTimeoutしなかった症状は、内部timeoutが実施され、
Couldn't find any UpnP devices
が表示されるようになりました。

Cygwin版で、Timeout値を設定しているにも関わらず、Timeoutしない件は、
別途、Webで調べてみます。

> 5. ローカルポート確認

こちら、別メールにて、報告させていただきます。



In This Thread