2017-02-07 20 views
1

Я пытаюсь передать UDP-пакет по всем NetworkInterfaces и получать ответы. Хотя я могу получать ответы от локальной сети, устройство, подключенное через кроссоверное соединение, не может получить ответ.UDP-трансляция через кроссоверное соединение

Это код, чтобы получить все интерфейсы, которые действительно возвращаются соединение кроссовера NetworkInterface

Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); 
     while(interfaces.hasMoreElements()){ 
      List<InterfaceAddress> iAddrs = interfaces.nextElement().getInterfaceAddresses(); 
      iAddrs.forEach(addr -> { 
       if(addr.getBroadcast() != null){ 
        System.out.println(addr.getBroadcast()); 

        sendUDP(addr.getBroadcast()); 
       } 
      }); 
     } 

Затем я использую этот раздел кода для отправки пакета UDP и слушать ответы.

final DatagramSocket socket = new DatagramSocket(9800); 
    socket.setBroadcast(true); 
    socket.setSoTimeout(5000); 
    final byte[] data = "A-UDP-BROADCAST".getBytes(); 
    byte[] buffer = new byte[1024]; 

    socket.send(new DatagramPacket(data, data.length, addr, 9800)); 

    while (true) { 
     try { 
      final DatagramPacket packet = new DatagramPacket(buffer, buffer.length); 
      socket.receive(packet); 
      System.out.println(new String(packet.getData())); 

     } catch (SocketTimeoutException e) { 
      System.out.println("Timed out."); 
      return; 
     } 
     buffer = new byte[1024]; 
    } 

Это должен быть проблемой в этом разделе коды, как, когда я посылаю пакет с внешней программой, такими как PacketSender я в состоянии получить ответ.

+1

Если он работает на локальном хосте, это явно * не проблема с кодом. Это проблема с топологией или маршрутизацией или кабелем. – EJP

+0

@EJP PacketSender, являющийся сторонним приложением для отладки TCP/UDP, может получать ответы, поэтому должна быть ошибка в коде. Это либо проблема, либо проблема JVM, и я не собираюсь говорить об этом без большого тестирования. – Beryllium

+1

«Подключено через кроссоверное соединение». Означает ли это перекрестный * кабель *? Это проблема физического уровня, и в современном оборудовании почти всегда обрабатываются автоматически и прозрачно сетевыми интерфейсами. Если вы можете вообще общаться между двумя системами, трудно понять, как это может быть частью этой проблемы. Я бы использовал wirehark для определения того, какие пакеты фактически отправляются между двумя системами. –

ответ

1

Что мне не так плохо в вашем коде, так это то, как вы связываете прием и передачу сокета с одним и тем же портом. Без setReuseAddress() одно из связок должно потерпеть неудачу. Чтобы исправить это, просто измените первую строку во втором фрагменте кода, чтобы использовать любой свободный порт:

final DatagramSocket socket = new DatagramSocket();