Autore Topic: Permesso negato utilizzando l'ip di broadcast  (Letto 796 volte)

Offline Mattia_

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
Permesso negato utilizzando l'ip di broadcast
« il: 18 Agosto 2017, 20:39:51 CEST »
0
Salve a tutti,
sto cercando di creare un'applicazione in grado di comunicare con  dispositivi connessi alla mia rete locale.
Per stabilire la comunicazione tra il mio dispositivo (LG-G3, Android 6.0) e gli altri in ascolto, ho la necessità di inviare dei pacchetti a tutti i devices connessi alla wi-fi.  Per evitare di dover eseguire un loop e pingare tutti i possibili indirizzi (da 192.168.1.1 a 192.168.1.254), ho deciso di utilizzare l'indirizzo ip di broadcasting, nel mio caso 192.168.1.255; purtroppo questo sembra dare dei problemi di permessi:


java.net.ConnectException: failed to connect to /192.168.1.255 (port 4444): connect failed: EACCES (Permission denied)
   at libcore.io.IoBridge.connect(IoBridge.java:124)
   at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
   at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:163)
   at java.net.Socket.startupSocket(Socket.java:594)
   at java.net.Socket.<init>(Socket.java:279)
   at processing.test.sketch_170818a.sketch_170818a.setup(sketch_170818a.java:32)
   at processing.core.PApplet.handleDraw(Unknown Source)
   at processing.core.PGraphicsAndroid2D.requestDraw(Unknown Source)
   at processing.core.PApplet.run(Unknown Source)
   at java.lang.Thread.run(Thread.java:818)
Caused by: android.system.ErrnoException: connect failed: EACCES (Permission denied)
   at libcore.io.Posix.connect(Native Method)
   at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:111)
   at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
   at libcore.io.IoBridge.connect(IoBridge.java:122)
   ... 9 more


Se provo ad inviare un pacchetto ad un normale indirizzo ip (es. 192.168.1.2) della rete non succede nulla e tutto fila liscio.
Questo è il mio codice:
(Premessa: siccome sono nuovo ad Android sto utilizzando Processing [www.processing.org] come IDE; ha sempre compilato le applicazioni a dovere e non ho avuto alcun problema)

Codice (Java): [Seleziona]
void setup()
{
  try
  {
    InetAddress address = InetAddress.getByAddress(new byte[]{(byte) 192, (byte) 168, (byte) 1, (byte) 255});
    Socket socket = new Socket(address, 4444, false);
  }catch (Exception e)
  {
    e.printStackTrace();
  }
}

Grazie in anticipo,
Mattia


Offline DCodeOS

  • Utente junior
  • **
  • Post: 84
  • Respect: +20
    • Mostra profilo
  • Sistema operativo:
    macOS Sierra
Re:Permesso negato utilizzando l'ip di broadcast
« Risposta #1 il: 18 Agosto 2017, 21:19:58 CEST »
0
Prova ad aggiungere nel manifest
Codice (XML): [Seleziona]
<uses-permission android:name="android.permission.INTERNET"/>
┻━┻ ︵ヽ(°□°ヽ) Develop w/ ( ( ObjC || Swift ) && Java[ "Android" ] ) (╯°□°)╯︵ ┻━┻

Offline Mattia_

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
Re:Permesso negato utilizzando l'ip di broadcast
« Risposta #2 il: 19 Agosto 2017, 12:25:20 CEST »
0
Purtroppo ho già provato ad aggiungere i permessi e non funziona comunque..
Ad un certo punto ho dato tutti i permessi possibili all'applicazione, anche se la maggior parte di questi non c'entrava nulla con i internet ed il wi-fi ... ma nulla da fare. Grazie della risposta !

Il logcat riporta una ErrnoException..  dando un'occhiata alla documentazione

https://developer.android.com/reference/android/system/ErrnoException.html

l'errore dovrebbe essere causato da un metodo del sistema android che fallisce.. Qualche idea? Grazie mille

Offline digx

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G6
Re:Permesso negato utilizzando l'ip di broadcast
« Risposta #3 il: 19 Agosto 2017, 15:24:41 CEST »
0
Puoi provare ad utilizzare multicast oppure utilizza broadcast ma con udp (datagramsocket)

Offline Mattia_

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
Re:Permesso negato utilizzando l'ip di broadcast
« Risposta #4 il: 20 Agosto 2017, 08:59:42 CEST »
0
Fantastico!
Utilizzando la classe DatagramSocket invece di un normale Socket funziona tutto a meraviglia!
Grazie mille a tutti!

Ecco il codice, spero che potrà essere d'aiuto in futuro:

Codice (Java): [Seleziona]
void setup()
{
  try
  {
    InetAddress address = InetAddress.getByAddress(new byte[]{(byte) 192, (byte) 168, (byte) 1, (byte) 255});    
    byte[] buf = new byte[]{'a','b','c','d'};
    DatagramSocket socket = new DatagramSocket(4445);
    DatagramPacket packet = new DatagramPacket(buf,buf.length, address, 4444);
    socket.send(packet);
    socket.close();
  }
  catch (Exception e)
  {
    e.printStackTrace();
  }
}

Offline digx

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G6
Re:Permesso negato utilizzando l'ip di broadcast
« Risposta #5 il: 20 Agosto 2017, 19:01:31 CEST »
0
;)