Index: src/org/kde/kdeconnect/Backends/LanBackend/LanLinkProvider.java =================================================================== --- src/org/kde/kdeconnect/Backends/LanBackend/LanLinkProvider.java +++ src/org/kde/kdeconnect/Backends/LanBackend/LanLinkProvider.java @@ -378,25 +378,33 @@ throw new IOException("No ports available"); } - //get correct address - private InetAddress getBroadcastAddress() throws IOException { + //Get broadcast ip address + private String getBroadcastAddress() { WifiManager wifi = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE); DhcpInfo dhcp = wifi.getDhcpInfo(); int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask; - byte[] quads = new byte[4]; - for (int k = 0; k < 4; k++) - quads[k] = (byte) ((broadcast >> k * 8) & 0xFF); - return InetAddress.getByAddress(quads); + StringBuilder sb = new StringBuilder(); + for (int k = 0; k < 4; k++) { + sb.append(((broadcast >> k * 8) & 0xFF)); + sb.append("."); + } +// Log.i("LanLinkProvider", "broadcast ip:"+sb.subSequence(0, sb.length() - 1)); + return sb.subSequence(0, sb.length() - 1).toString(); } private void broadcastUdpPacket() { - if (NetworkHelper.isOnMobileNetwork(context)) { Log.w("LanLinkProvider", "On 3G network, not sending broadcast."); return; } new Thread(() -> { + String deviceListPrefs = PreferenceManager.getDefaultSharedPreferences(context).getString(CustomDevicesActivity.KEY_CUSTOM_DEVLIST_PREFERENCE, ""); + ArrayList iplist = new ArrayList<>(); + iplist.add(getBroadcastAddress()); + if (deviceListPrefs!=null &&!deviceListPrefs.isEmpty()) { + iplist = CustomDevicesActivity.deserializeIpList(deviceListPrefs); + } NetworkPacket identity = NetworkPacket.createIdentityPacket(context); int port = (tcpServer == null || !tcpServer.isBound()) ? MIN_PORT : tcpServer.getLocalPort(); @@ -414,21 +422,22 @@ } if (bytes != null) { - try { - InetAddress dstHost = getBroadcastAddress(); - Log.w("LanLinkProvider", "broadcast target ip:"+dstHost.getHostAddress()); - socket.send(new DatagramPacket(bytes, bytes.length, dstHost, MIN_PORT)); - socket.send(new DatagramPacket(bytes, bytes.length, dstHost, MIN_PORT_LEGACY)); - } catch (IOException e) { - e.printStackTrace(); - Log.e("KDE/LanLinkProvider", "Sending udp identity package failed. Invalid address?"); + for (String ipstr : iplist) { + try { + InetAddress client = InetAddress.getByName(ipstr); + socket.send(new DatagramPacket(bytes, bytes.length, client, MIN_PORT)); + socket.send(new DatagramPacket(bytes, bytes.length, client, MIN_PORT_LEGACY)); + //Log.i("KDE/LanLinkProvider","Udp identity package sent to address "+client); + } catch (Exception e) { + e.printStackTrace(); + Log.e("KDE/LanLinkProvider", "Sending udp identity package failed. Invalid address? (" + ipstr + ")"); + } } } if (socket != null) { socket.close(); } - }).start(); }