[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. ローカルポート確認
こちら、別メールにて、報告させていただきます。