2011-07-05 18 views
15

java'da bir ağ programı programlıyorum ve bazı Paketleri 255.255.255.255'e göndermek istiyorum, ancak 192.168.1.255'e gönderdiğimde bile başarısız oluyor. ifconfig komutunun çıkışına göre, yayın adresidir. Ama onları arkadaşımın IP'sine gönderdiğimde iyi çalışıyor. Hiçbir İstisnalar atılıyorJava DatagramSocket tarafından 255.255.255.255'e paketleri gönderme

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()); 
    } 
} 

: Burada Ağı benim uygulanması, ben bunu DatagarmSocket ve datagram paketleri kullandım

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()); 
    } 
} 

:

İşte benim programa kod.
Ad hoc bir ağdayım.
Arkadaşım kubuntu 11.04 kullanırken MAC OS X 10.6 kullanıyorum.

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 benim dostum bağlanmak için kullanıyorum cihazdır: Ve burada ifconfig çıkıştır.

kolaylaştırır Lütfen ben bir acemi :) önceden

teşekkürler değilim. yayın kullanırken

+0

Lütfen 'ifconfig' çıktısını gösterin! – ShiDoiSi

+0

Yayını genişletdim. –

cevap

10

Eğer iki bilgisayar, iki farklı ağlar ise yönlendirici doğru yapılandırıldığından emin olmak gerekir o

socket.setBroadcast(true); 

başka şeydir etkinleştirmeniz gerekir. Yayınlar genellikle varsayılan olarak yönlendirilmez. Ayrıca, kablosuz arabirime ve kablolu bir arabirime sahip bir yönlendiriciniz varsa, bu yayınlar yayınlar etkin değilse çalışmayabilir (Varsayılan olarak bu iki arabirim arasında yayın ileten donanım olabilir).

+0

socket.setBroadcast (true) 'ı socket.connect (...)' den hemen sonra ekledim. Ama hala çalışmıyor. Sorun ne? –

+0

Yayını uzatıyorum. – fyr

+0

Teşekkürler. Ama hayır, yönlendirici yok. Bu özel bir ağ. Bir bilgisayardan bilgisayara. Ama bu çalışmıyor. Ağda yayınlamanın düzenli yolu nedir? –

1

Doğru hatırlıyorsam, you cannot receive from broadcast-adresses, ancak yalnızca onlara gönderin! Yani alıcı tarafta, özellikle "sizin" IP'nizi dinlemelisiniz.

+0

Gerçekten mi? Ama nasıl ? Gönderilecek DatagramSocket ve başka bir DatagramSocket almalı mıyım? Ve ikisi de aynı limanda mı? Bence bu imkansız. (Bence OS aynı bağlantı noktasına sahip iki sokete sahip olmamıza izin vermez) –

+0

@ Pro.Hessam, gönderenin belirli bir portu kullanması gerekmiyor, herhangi bir işlem yapacaktır. – ShiDoiSi

+0

Yani paketleri 8030 portuna gönderip 8027'den aldığım anlamına mı geliyor? 255.255.255.255'e bağlı bir DatagramSocket ve localhost'a bağlı bir DatagramSocket bağlantı noktası 8030, diğeri port 8027 kullanıyordum. Fakat çalışmıyor. Sorun ne? –

2

192.168.1.255

  • ağındaki alt ağ maskesini kontrol edin. Makineniz ve makinenin şebekesiyle aynı olmayabilir.
  • Lütfen makinenin mevcut olduğunu kontrol edin.
  • Eğer yönlendiriciyse, mesajın hedefe iletileceğini düşünmüyorum.
+0

@Karnahire, Bu noktada. Paketleri kendime gönderiyorum. (paketleri "192.168.1.255" e göndererek). Ama onları alamıyorum. Ama paketleri "localhost" a gönderdiğimde iyi çalışıyor. –

+0

Windows adresi 192.168.1.255 yayını, Windows ve Mac için çalışmaz. Neden bulamadım? – Kamahire

5

yerine sadece hedef datagram paketleri oluşturmak, yayın adresine DatagramSocket bağlamak , yani

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

Ve büyü gibi, bir yayın gönderdik. Ve sonra diğer tarafta yakalamak için, sadece o son noktayı dinlemeniz gerekir:

DatagramSocket dsock = new DatagramSocket(samePortUsedAbove); 
DatagramPacket dp = new DatagramPacket(byteArray, byteArray.length); 
dsock.receive(dp);