MulticastSocket: Socket operasjon på ikke-kontakten

stemmer
1

Jeg har noen kode som dette:

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

På Windows 7 og Windows XP med JDK6u17, jeg fikk en SocketException: Socket drift på ikke-kontakt.

Men hvis jeg endrer linje 2 til:

MulticastSocket socket = new MulticastSocket(0);

Det er ok, og verkene finner også med jdk6u14.

Hvorfor? Takk.

EDIT: Hvorfor port 0 bør være i veien?

MulticastSocket socket = new MulticastSocket(0);

Alt går bra med dette code.But ikke

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

Uansett porten er.

Publisert på 29/12/2009 klokken 23:25
kilden bruker
På andre språk...                            


6 svar

stemmer
0

Ifølge dokumentasjonen , har du tenkt på å bruke det med en port nummer (altså 0 ville være gyldig).

Svarte 29/12/2009 kl. 23:32
kilden bruker

stemmer
0

Jeg er ikke så sikker. Hva er konstruktøren MulticastSocket (SocketAddress bindaddr) for. Og hvorfor det fungerer fint med jdk6u14, men ikke jdk6u17? Og hvorfor det ok på Windows 2003 Server med jdk6u17?

På RHEL5.2 jdk1.4 +

http://www.sockets.com/err_lst1.htm Berkeley beskrivelse: En operasjon ble forsøkt på noe som ikke er en stikkontakt. Den angitte kontakten parameter refererer til en fil, ikke en stikkontakt.

WinSock beskrivelse: Samme som Berkeley. Sokkelen inngangsparameter ikke er en gyldig stikkontakt håndtak (enten det var aldri er gyldig, er det en fil håndtak (ikke en socket håndtak), eller dersom det var en stikkontakt håndtak, har det blitt lukket).

Detaljert beskrivelse:

Velg (): mislykkes med WSAENOTSOCK eventuelt uttak i en fd_set er en ugyldig socket håndtak.

Utvikler forslag: Har du lukker en socket utilsiktet i en del av et program uten å holde en annen del varslet? Bruk stikkontakt tilstand i et program og / eller håndtere denne feilen elegant som en ikke-fatal feil.

når den MulticastSocket opprettet, socket.isClosed () == sann

Svarte 30/12/2009 kl. 00:08
kilden bruker

stemmer
-1

Jeg har ikke brukt disse klassene før, men unntak skjer på linje 3 når du kaller setInterfacemetoden.

Jeg vil gjette det er noe om at du bruker den samme referansen to ganger eller noe. Jeg fant en kodebit som så slik ut, kanskje dette er hvordan du skal gjøre det:

    MulticastSocket ms = new MulticastSocket(new InetSocketAddress(0));
    ms.setInterface(InetAddress.getByName("192.168.0.1"));
Svarte 30/12/2009 kl. 00:33
kilden bruker

stemmer
-1

Du bør først opprette Multicast kontakten med en velkjent port - noe høyere enn 1024 og mindre enn 65 535 - som allerede nevnt 0 betyr at operativsystemet vil velge en port for deg (men da det kommer til å være ganske tilfeldig - som jeg antar du ikke vil).

For multicast - du vanligvis må sette grensesnittet til bruk på joinGroup () ikke på skapelsen - f.eks:

MulticastSocket stikkontakt = 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());
}
Svarte 31/12/2009 kl. 13:48
kilden bruker

stemmer
-1

Ifølge MulticastSocket dokumentasjon bør du bruke

Klasse D IP-adresser i området 224.0.0.0 til 239.255.255.255, inkluderende

å binde en MulticastSocket. Angivelig, "192.168.0.1" er ute av multicast-serien.

Svarte 24/06/2010 kl. 07:10
kilden bruker

stemmer
2

Som du binde seg til en bestemt grensesnitt, ringer setInterface () til det samme grensesnittet er overflødig. Fjern det. Det er bare nødvendig når du binder til INADDR_ANY, eller i Java en InetAddress av null (eller uspesifisert som en parameter).

For å løse feil i noen av de andre svarene, og deres implikasjoner:

  1. Port null er lovlig. Det betyr at et system-port tilordnet.
  2. Du trenger bare en MulticastSocket for å motta multicasts. For å sende, kan du bare bruke en DatagramSocket.
  3. Hvis multicast-grensesnittet må spesifiseres, som det ikke i dette tilfellet, kan det gjøres enten via MulticastSocket.setInterface () eller når du ringer joinGroup () eller leaveGroup (). Det siste alternativet gir deg detaljnivå på gruppenivå, men begge teknikkene fungerer. Det er derfor de er begge gitt.
  4. Hvis du ikke binde seg til en bestemt grensesnitt bør du definitivt kalle setInterface (). Hvis du er på en multi-omplassert vert du må ringe joinGroup () / leaveGroup () en gang per grensesnitt, hvis du ønsker å motta via dem alle.

Og et spørsmål: er 192.168.0.1 en IP-adresse fra en NIC på den lokale maskinen? Det må være.

Svarte 21/08/2010 kl. 00:53
kilden bruker

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