MulticastSocket: Socket Betrieb auf nicht-Buchse

stimmen
1

Ich habe einige Code wie folgt aus:

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

Auf Windows 7 und Windows XP mit JDK6u17, bekam ich einen Socket: Socket Betrieb auf nicht-Buchse.

Aber wenn ich die Linie 2 zu ändern:

MulticastSocket socket = new MulticastSocket(0);

Es ist in Ordnung, und Arbeiten finden auch mit jdk6u14.

Warum? Vielen Dank.

EDIT: Warum Port 0 sollte die Angelegenheit sein?

MulticastSocket socket = new MulticastSocket(0);

Alles geht gut mit diesem code.But nicht

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

Was auch immer der Hafen ist.

Veröffentlicht am 30/12/2009 um 00:25
quelle vom benutzer
In anderen Sprachen...                            


6 antworten

stimmen
0

Gemäß der Dokumentation sollen Sie es mit einer Portnummer instanziiert (so würde 0 gültig sein).

Beantwortet am 30/12/2009 um 00:32
quelle vom benutzer

stimmen
0

Ich bin nicht sicher. Was ist der Konstruktor MulticastSocket (Socket bindaddr) für. Und warum funktioniert es mit jdk6u14 in Ordnung, aber nicht jdk6u17? Und warum es ok auf Windows 2003 Server mit jdk6u17?

Auf RHEL5.2 jdk1.4 +

http://www.sockets.com/err_lst1.htm Berkeley Beschreibung: Eine Operation wurde auf einem Objekt , das kein Socket ist. Der angegebene Parameter Socket bezieht sich auf eine Datei, nicht eine Steckdose.

WinSock Beschreibung: Die gleiche wie Berkeley. Der Socket-Parameter ist kein gültiger Socket-Handle (entweder es war nie gültig, es ist ein Datei-Handle (kein Socket-Handle), oder wenn es einen Socket-Handle war es geschlossen wurde).

Detaillierte Beschreibung:

(Wählen): nicht mit WSAENOTSOCK, wenn eine Steckdose in einem fd_set ein ungültiger Socket-Handle ist.

Entwickler Vorschläge: Haben Sie ihm eine Buchse versehentlich in einem Teil einer Anwendung, ohne einen anderen Teil benachrichtigt zu halten? Verwenden Buchse Zustandes in einer Anwendung und / oder diesen Fehler behandelt ordnungsgemäß als nicht-fatale Fehler.

wenn die MulticastSocket erstellt, socket.isClosed () == true

Beantwortet am 30/12/2009 um 01:08
quelle vom benutzer

stimmen
-1

Ich habe nicht diese Klassen vor, aber die Ausnahme tritt in Zeile 3 , wenn Sie rufen Sie die verwendete setInterfaceMethode.

Ich würde vermuten, es ist etwas, mit dem Effekt, dass Sie den gleichen Bezug zweimal oder etwas verwenden. Ich ein Code-Snippet gefunden, die so aussah, vielleicht ist dies, wie Sie sollte es tun:

    MulticastSocket ms = new MulticastSocket(new InetSocketAddress(0));
    ms.setInterface(InetAddress.getByName("192.168.0.1"));
Beantwortet am 30/12/2009 um 01:33
quelle vom benutzer

stimmen
-1

Sie sollten zunächst die Multicast-Buchse mit einem bekannten Port schaffen - etwas höher als 1024 und weniger als 65535 - wie bereits erwähnt 0 bedeutet, dass das Betriebssystem einen Port für Sie wählen, wird (aber dann seine irgendwie zufällig sein würde - was ich Ihnen raten nicht wollen).

Für Multicast - müssen Sie in der Regel die Schnittstelle einstellen auf joinGroup () nicht auf Erstellung verwendet werden - zB:

MulticastSocket Buchse = new 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());
}
Beantwortet am 31/12/2009 um 14:48
quelle vom benutzer

stimmen
-1

Nach Angaben der MulticastSocket Dokumentation sollten Sie

Klasse D IP-Adressen im Bereich 224.0.0.0 bis 239.255.255.255, inklusive

zu binden, um eine MulticastSocket. Offenbar ist die „192.168.0.1“ aus dem Multicast-Bereich.

Beantwortet am 24/06/2010 um 08:10
quelle vom benutzer

stimmen
2

Wie Sie auf eine bestimmte Schnittstelle verbindlich sind, ist setInterface () auf die gleiche Schnittstelle Aufruf überflüssig. Entfernen Sie es. Es ist nur erforderlich, wenn Sie an INADDR_ANY binden oder in Java ein InetAddress von null (oder nicht näher als Parameter).

Zur Bewältigung Fehler in einigen der anderen Antworten, und ihre Auswirkungen

  1. Port Null ist legal. Es ist ein System-Port zugeordnet.
  2. Sie brauchen nur einen MulticastSocket für Empfang Multicasts. Für den Versand, können Sie einfach ein Datagram verwenden.
  3. Wenn die Multicast-Schnittstelle angegeben werden muss, die es nicht in diesem Fall kann es erfolgt entweder über MulticastSocket.setInterface werden () oder beim Aufruf joinGroup () oder Leavegroup (). Die letztere Option gibt Ihnen Granularität auf Gruppenebene, aber beide Techniken arbeiten. Deshalb sind sie beide zur Verfügung gestellt sind.
  4. Wenn Sie nicht an eine bestimmte Schnittstelle binden, sollten Sie auf jeden Fall setInterface () aufrufen. Wenn Sie auf einem Multi-homed Host sind Sie müssen joinGroup () aufrufen / Leavegroup () einmal pro Schnittstelle, wenn Sie über alle von ihnen erhalten möchten.

Und eine Frage: ist 192.168.0.1 eine IP-Adresse eines NIC auf dem lokalen Rechner? Es muss sein.

Beantwortet am 21/08/2010 um 01:53
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more