0


1

私はポート16800にUDPパケットを送るためにこのrubyプログラムを書きました:

'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でlistenしている私のUDPサーバーは何も受信していません。

プログラムを少し書き直すと

'socket' sock = UDPSocket.newを必要とします。sock.setsockopt(Socket :: SOL_SOCKET、Socket :: SO_BROADCAST、true) sock.close

パケットはWiresharkに表示されますが、私のサーバーはまだ何も受信していません。

明らかな何かが足りない?

編集:完全を期すためのサーバーコード

必須 'socket' sock = UDPSocket.new sock.setsockopt(Socket :: SOL_SOCKET、Socket :: SO_BROADCAST、true)sock.bind(nil、16800)がtrueである場合、packet = sock.recvfrom(1024)はパケットの終わり

しかし、これはインターネットのどこかにコピーされていて、stackoverflow用に編集している間、サーバは常に127.0.0.1に送信されたパケットを受信しますが、nilを ""に変更すると、サーバは突然上記の送信パケットも受信します。 これはルビーソケット実装のバグですか?

5 回答


1


UDPSocket.BINDはホストとポートを取ります。 nilをあなたのIPアドレスに変えてみてください。 http://coderrr.wordpress.com/2008/05/28/get-your-local-ip-address/から。つかいます

'socket'が必要

def local_ip orig、Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup、true#DNSの逆引き解決を一時的に無効にする

UDPSocket.open do | s | s.connect '64 .233.187.99 '、1 s.addr.last end Socket.do_not_reverse_lookup = orig endを確認してください

あなたのIPを取得する


1


私はちょうどあなたのコードを使用しました、そして問題はあなたが特定のIPアドレスに拘束力がないことです。 私はLinuxについては知りませんが、OS Xではあなたが期待していたインターフェースではなくデフォルトが未使用のIP6アドレスに割り当てられることがあるという問題があります。

サーバー上で ""を192.168.1.255に変更し、クライアント内のバインドに "192.168.1.255"を含めると、これらすべてがうまくいったのです:)


0


"localhost"または "127.0.0.1"に送信しましたか? これはローカルコンピュータに直接送信され、問題の診断に役立ちます。


0


ここでは憶測のようなものですが、あなたはこのようなことを考えたいと思うかもしれません - あなたがコンピュータ自身のIPを使うとき、パケットは物理リンクb / c上に見えません。彼らがどこに向かっているのかを知るためには、それらを7層スタックモデルの上位層の1つ(おそらく「トランスポート」層)でコンピュータの内部に向けることができます。


0


そのような接続が機能するはずで、Wiresharkを使用してパッケージを参照している場合は、マシンのソフトウェアファイアウォールも確認する必要があります。 使用したいUDPポートへのトラフィックがブロックされても、Wiresharkを使用してパッケージを見ることができます。