2011-07-05 15 views
15

Programuję program sieciowy w Javie i chcę wysłać kilka pakietów do 255.255.255.255, ale to się nie udaje, nawet gdy wysyłam je do 192.168.1.255, co zgodnie z wynikiem polecenia ifconfig jest adresem rozgłoszeniowym. Ale kiedy wysyłam je do IP mojego partnera, działa dobrze.Wysyłanie pakietów do 255.255.255.255 przez Java DatagramSocket kończy się niepowodzeniem

Oto kod mojego programu:

public class StackOverFlow { 
    public static void main(String[] args) { 
     Network net= new Network(); 

     Scanner input= new Scanner(System.in); 
     while(input.hasNext()) 
      net.sendMessage(input.nextLine()); 
    } 
} 

Użyłem DatagarmSocket i DatagramPacket zrobić tak, tu jest mój wdrażania sieci:

class Network { 
DatagramSocket socket; 

public Network() { 
    try { 
     socket = new DatagramSocket(8027); 
     socket.setBroadcast(true); 
     socket.connect(InetAddress.getByName("255.255.255.255"), 8027); 
    } catch (Exception e) { 
     System.err.println("Connection failed. " + e.getMessage()); 
    } 
    listen(); 
} 

public void listen() { 
    new Thread() { 
     public void run() { 
      while (true) { 
       try { 
        byte[] buf = new byte[1000]; 
        DatagramPacket packet = new DatagramPacket(buf, 
          buf.length); 
        socket.receive(packet); 
        String message = new String(buf); 
        System.out.println("Recieved: " + message); 
        if (message.equals("end")) 
         return; 
       } catch (Exception e) { 
        System.err.println(e.getMessage()); 
       } 
      } 
     } 
    }.start(); 
} 

public void sendMessage(String message){ 
    byte[] buf= message.getBytes(); 

    DatagramPacket packet= new DatagramPacket(buf, buf.length); 
    try{ 
     socket.send(packet); 
    }catch(Exception e){ 
     System.err.println("Sending failed. " + e.getMessage()); 
    } 
} 

bez wyjątków są wyrzucane.
Jestem w sieci ad hoc.
Używam MAC OS X 10.6, podczas gdy mój kumpel używa Kubuntu 11.04. I tu jest wyjście ifconfig:

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 
inet6 ::1 prefixlen 128 
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 
inet 127.0.0.1 netmask 0xff000000 
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280 
stf0: flags=0<> mtu 1280 

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 
inet6 fe80::21f:f3ff:fed5:4779%en0 prefixlen 64 scopeid 0x4 
inet 192.168.1.1 netmask 0xffffff00 broadcast 192.168.1.255 
ether 00:1f:f3:d5:47:79 
media: autoselect (100baseTX <full-duplex>) status: active 
supported media: autoselect 10baseT/UTP <half-duplex> 10baseT/UTP <full-duplex> 10baseT/UTP  <full-duplex,hw-loopback> 10baseT/UTP <full-duplex,flow-control> 100baseTX <half- duplex> 100baseTX <full-duplex> 100baseTX <full-duplex,hw-loopback> 100baseTX <full-duplex,flow-control> 1000baseT <full-duplex> 1000baseT <full-duplex,hw-loopback> 1000baseT <full-duplex,flow-control> none 

en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 
inet6 fe80::21d:4fff:feff:2b4d%en1 prefixlen 64 scopeid 0x5 
inet 213.233.170.97 netmask 0xfffffc00 broadcast 213.233.171.255 
ether 00:1d:4f:ff:2b:4d 
media: autoselect status: active 
supported media: autoselect 

fw0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 2030 
lladdr 00:21:e9:ff:fe:bc:79:b2 
media: autoselect <full-duplex> status: inactive 
supported media: autoselect <full-duplex> 

en2: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 
ether 00:1f:f3:b6:2c:be 
media: autoselect status: inactive 
supported media: none autoselect 10baseT/UTP <half-duplex> 

vmnet1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 
inet 192.168.149.1 netmask 0xffffff00 broadcast 192.168.149.255 
ether 00:50:56:c0:00:01 

vmnet8: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 
inet 192.168.73.1 netmask 0xffffff00 broadcast 192.168.73.255 
ether 00:50:56:c0:00:08 

en0 jest urządzeniem używam do łączenia się z moim kolegą.

proszę zrobić to proste, jestem nowicjuszem :)

góry dzięki.

+0

Proszę pokazać wynik polecenia 'ifconfig'! – ShiDoiSi

+0

Rozszerzyłem wpis. –

Odpowiedz

10

Podczas korzystania nadawanie musisz włączyć to

socket.setBroadcast(true); 

Inną rzeczą jest to, że trzeba się upewnić, że router jest skonfigurowany w porządku, jeśli oba komputery są w dwóch różnych sieciach. Transmisje są zwykle domyślnie nie routowane. Ponadto, jeśli masz router z interfejsem Wirless i przewodowym interfejsem, te transmisje mogą nie działać, jeśli transmisje nie są włączone (może być sprzęt, który domyślnie transmituje transmisje między tymi dwoma interfejsami).

+0

Dodałem socket.setBroadcast (true) zaraz po socket.connect (...). Ale nadal nie działa. Jaki jest problem? –

+0

Rozszerzam post. – fyr

+0

Dzięki. Ale nie, nie ma routera. To sieć ad hoc. Komputer z komputerem. Ale to nie działa. Jaki jest standardowy sposób nadawania w sieci? –

1

Jeśli dobrze pamiętam, you cannot receive from broadcast-adresses, ale tylko wysłać do nich! Tak więc po stronie odbiorczej musisz słuchać "swojego" adresu IP specjalnie.

+0

Naprawdę? Ale jak ? Powinienem mieć DatagramSocket do wysłania i inny DatagramSocket do odbioru? I oba w tym samym porcie? Myślę, że to niemożliwe. (Myślę, że OS nie pozwoli nam mieć dwóch gniazd z tym samym portem) –

+0

@ Pro.Hessam, nadawca nie musi korzystać z konkretnego portu, każdy zrobi to. – ShiDoiSi

+0

masz na myśli to, że wysyłam pakiety do portu 8030 i na przykład je otrzymuję z 8027? Zrobiłem DatagramSocket podłączony do 255.255.255.255 i DatagramSocket podłączony do localhost jeden używa portu 8030, drugi używa portu 8027. ale to nie działa. Jaki jest problem? –

2

192.168.1.255

  • Proszę sprawdzić maskę podsieci w sieci. Możliwe, że Twoja maszyna i urządzenie mogą nie być tej samej sieci .
  • Proszę sprawdzić, czy maszyna istnieje.
  • jeśli to router, to nie sądzę, że wiadomość zostanie przesłana do miejsca docelowego.
+0

@Karnahire, W tym momencie. Wysyłam pakiety do mnie. (wysyłając pakiety do "192.168.1.255"). Ale nie mogę ich przyjąć. Ale kiedy wysyłam pakiety do "localhost", działa dobrze. –

+0

Transmisja adresu IP 192.168.1.255 nie działa w przypadku systemu Windows i komputera Mac. Nie znalazłem dlaczego? – Kamahire

5

Zamiast połączyć DatagramSocket na adres broadcast, tak skonstruować, aby go DatagramPacket cel, tj

DatagramPacket dp = new DatagramPacket(byteArray, byteArray.length, InetAddress.getByName("255.255.255.255"), yourPortNumber); 

I jak magia, ty wysłałeś audycji. A następnie, aby złapać go po drugiej stronie, po prostu słuchaj na tym porcie:

DatagramSocket dsock = new DatagramSocket(samePortUsedAbove); 
DatagramPacket dp = new DatagramPacket(byteArray, byteArray.length); 
dsock.receive(dp); 
Powiązane problemy