1

次のようなコードがあります。

InetAddress bind = InetAddress.getByName("192.168.0.1")
MulticastSocket socket = new MulticastSocket(new InetSocketAddress(bind,0));
socket.setInterface(bind);

JDK6u17 を使用する Windows 7 および Windows XP で、SocketException: Socket operation on non socket が発生しました。

しかし、2行目を次のように変更すると:

MulticastSocket socket = new MulticastSocket(0);

大丈夫です。jdk6u14 でも find が動作します。

なんで?ありがとう。

編集: なぜポート 0 が問題になるのでしょうか?

MulticastSocket socket = new MulticastSocket(0);

このコードではすべてうまくいきますが、そうではありません

MulticastSocket socket = new MulticastSocket(new InetSocketAddress(bind,port));

ポートは何でも構いません。

4

6 に答える 6

2

特定のインターフェースにバインドしているため、同じインターフェースに対して setInterface() を呼び出すのは冗長です。それを除く。INADDR_ANY にバインドする場合、または Java で null の (またはパラメーターとして指定されていない) InetAddress にバインドする場合にのみ必要です。

他のいくつかの回答のエラーとその意味に対処するには:

  1. ポート 0 は有効です。システムが割り当てたポートを意味します。
  2. マルチキャストを受信するために必要なのは MulticastSocket だけです。送信には、DatagramSocket を使用できます。
  3. マルチキャスト インターフェイスを指定する必要がある場合は (この場合は必要ありません)、MulticastSocket.setInterface() を介して、または joinGroup() または leaveGroup() を呼び出すときに指定できます。後者のオプションでは、グループ レベルでの粒度が得られますが、どちらの手法も機能します。そのため、両方が提供されています。
  4. 特定のインターフェイスにバインドしない場合は、必ず setInterface() を呼び出す必要があります。マルチホーム ホストを使用している場合、すべてのインターフェイスを介して受信したい場合は、インターフェイスごとに joinGroup()/leaveGroup() を呼び出す必要があります。

質問: 192.168.0.1 はローカル マシン上の NIC の IP アドレスですか? そうである必要があります。

于 2010-08-21T02:53:57.953 に答える
0

よくわかりません。MulticastSocket(SocketAddress bindaddr)のコンストラクターは何ですか。そして、なぜそれはjdk6u14でうまく機能するが、jdk6u17では機能しないのですか?そして、なぜそれがjdk6u17を搭載したWindows 2003サーバーで問題ないのですか?

RHEL5.2jdk1.4+の場合

http://www.sockets.com/err_lst1.htm Berkeleyの説明:ソケットではないものに対して操作が試行されました。指定されたソケットパラメータは、ソケットではなくファイルを参照しています。

WinSockの説明:Berkeleyと同じです。ソケット入力パラメーターが有効なソケットハンドルではありません(有効ではなかったか、ファイルハンドル(ソケットハンドルではない)であるか、ソケットハンドルの場合は閉じられています)。

詳細な説明:

select():fd_set内のいずれかのソケットが無効なソケットハンドルである場合、WSAENOTSOCKで失敗します。

開発者の提案:アプリケーションの一部で、別の部分に通知を送信せずに、誤ってソケットを閉じましたか?アプリケーションでソケット状態を使用するか、このエラーを致命的でないエラーとして適切に処理します。

MulticastSocketが作成されたとき、socket.isClosed()== true

于 2009-12-30T02:08:08.947 に答える
0

documentationによると、ポート番号でインスタンス化することになっています(したがって、0が有効です)。

于 2009-12-30T01:32:42.293 に答える
-1

以前にこれらのクラスを使用したことはありませんが、setInterfaceメソッドを呼び出すと 3 行目で例外が発生します。

同じ参照を2回使用しているという効果があると思います。次のようなコードのスニペットを見つけました。

    MulticastSocket ms = new MulticastSocket(new InetSocketAddress(0));
    ms.setInterface(InetAddress.getByName("192.168.0.1"));
于 2009-12-30T02:33:20.267 に答える
-1

最初によく知られているポート (1024 より大きく 65535 より小さいポート) でマルチキャスト ソケットを作成する必要があります。既に述べたように、0 はオペレーティング システムがポートを選択することを意味します (ただし、そのポートはランダムになります。したくない)。

マルチキャストの場合 - 通常、作成時ではなく joinGroup() で使用するようにインターフェースを設定する必要があります - 例:

MulticastSocket ソケット = 新しい MulticastSocket(2121);

InetSocketAddress socketAddress = new InetSocketAddress("localhost", 2121);

if (networkInterfaceName != null){
        NetworkInterface ni = NetworkInterface.getByName(networkInterfaceName);
socket.joinGroup(this.socketAddress, ni);

}else {
   socket.joinGroup(socketAddress.getAddress());
}
于 2009-12-31T15:48:37.770 に答える
-1

MulticastSocket のドキュメントによると、使用する必要があります

224.0.0.0 から 239.255.255.255 までの範囲のクラス D IP アドレス

MulticastSocket をバインドします。どうやら「192.168.0.1」はマルチキャスト範囲外です。

于 2010-06-24T09:10:45.007 に答える