JmDNS работает в Eclipse в Windows 11, но не в Eclipse в macOS Monterey

#java #eclipse #jmdns

Вопрос:

Я пытаюсь работать над приложением, заброшенным в Sourceforge. Он называется kmttg (посмотрите его). Это java-приложение, которое позволяет владельцам Tivo редактировать и изменять записи OnePass на своих устройствах Tivo с компьютера. Срок действия сертификата RPC истекает в следующем месяце, и я пытаюсь понять, смогу ли я это исправить. Я получил код от SourceForge, и я работаю над тем, чтобы заставить его работать на моем компьютере(компьютерах).

У меня есть Eclipse для Java, установленный на моем ноутбуке с Windows 11 и на моем ноутбуке MacBook Pro 14″ под управлением Monterey.

Проблема, с которой я сталкиваюсь, заключается в том, что приложение пытается получить IP-адрес локального компьютера. Он отлично работает на моем компьютере под управлением Windows 11, но не работает на моем Macbook Pro M1 Pro под управлением Monterey.

Проблема возникает в приведенном ниже коде:

 package com.tivo.kmttg.main;   import java.net.DatagramSocket;  import java.net.InetAddress;  //import java.util.Date;  import java.util.Enumeration;  import java.util.Hashtable;  import java.util.Stack;   import javax.jmdns.JmDNS;  import javax.jmdns.ServiceInfo;   import com.tivo.kmttg.util.log;   public class mdns {  private JmDNS jmdns = null;  private Hashtablelt;String,ServiceInfogt; SERVICE = new   Hashtablelt;String,ServiceInfogt;();  //private int timeout = 5; // ~mins after which mdns   listening disabled  //private long start_time;    public mdns() {  try {  DatagramSocket socket = new DatagramSocket();  socket.connect(InetAddress.getByName("8.8.8.8"), 10002);  InetAddress IP = socket.getLocalAddress(); """ THIS WORKS ON WINDOWS 11 BUT NOT ON THE MACBOOK PRO MACHINE".   if (! IP.isReachable(3000))  IP = InetAddress.getLocalHost();  if (! IP.isReachable(3000))  log.error("mdns error: Can't determine valid IP for host running kmttg");  //log.print("IP="     socket.getLocalAddress().getHostAddress());  jmdns = JmDNS.create(IP);  socket.close();  //start_time = new Date().getTime();  } catch (Exception e) {  log.error("mdns error: "   e.getMessage());  }   }   

Версии Java JRE на обеих машинах-10.0.2. Уровень соответствия-1.8. В противном случае старый код не работает.

Затмение 2021-09 (4.2.1.0)

Все вспомогательные банки взяты из проекта SourceForge и одинаковы на обеих машинах.

НИЖЕ: показаны снимки экрана, когда он работает в Eclipse в Windows 11 и возвращает IP-адрес, а затем снова, когда он не работает на Macbook и возвращает IP 0.0.0.0

Любые мысли будут высоко оценены.

О, кстати, я профессионально кодировал Java с 2000 по 2014 год, и я только сейчас возвращаюсь к нему после выполнения некоторого быстрого кодирования.

Когда это не работает

Когда это не работает

Ответ №1:

Попробуйте выполнить итерацию по сетевым интерфейсам:

 import java.net.Inet4Address; import java.net.InterfaceAddress; import java.net.NetworkInterface; import java.util.Enumeration; import java.util.Iterator;  public class PrintNonloopbackIPv4Addresses {  public static void main(String[] args) throws Exception {  Enumerationlt;NetworkInterfacegt; networkInterfaces = NetworkInterface.getNetworkInterfaces();  while (networkInterfaces.hasMoreElements()) {  NetworkInterface face = networkInterfaces.nextElement();  for (Iteratorlt;InterfaceAddressgt; iterator = face.getInterfaceAddresses().iterator(); iterator.hasNext();) {  InterfaceAddress interfaceAddress = iterator.next();  if (interfaceAddress.getAddress().isLoopbackAddress())  continue;  if (interfaceAddress.getAddress() instanceof Inet4Address)  System.out.println(interfaceAddress.getAddress().getHostAddress());  }  }  } }  

Комментарии:

1. Спасибо вам за этот код, я его запустил и многое узнал об интерфейсах MacBook. Но я все еще озадачен, почему приведенный выше код возвращает IP-адрес в Windows 11, а не в macOS Monterey. Я должен упомянуть, что в kmttg.jar файл из продукта действительно запускается на моем Mac с чистой установкой. У меня есть декомпилятор Java, и после декомпиляции jar я вижу, что код в нем совпадает с исходным кодом, который я загрузил. Я действительно ценю, что вы нашли время, чтобы сделать это, хотя, поскольку это навело меня на след проблемы.

2. Я полагаю, что отследил источник проблемы с помощью проверки подключения SecurityManager. Я получаю проверку исключения Ошибка подключения отказано в доступе («java.net.SocketPermission» «8.8.8.8:10002» «подключение,разрешение»)