1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Socket Verbindung löst BufferOverflow aus

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von ChrisMobile, 04.12.2011.

  1. ChrisMobile, 04.12.2011 #1
    ChrisMobile

    ChrisMobile Threadstarter Android-Experte

    Beiträge:
    529
    Erhaltene Danke:
    74
    Registriert seit:
    17.03.2010
    Phone:
    HTC One X
    Hallo zusammen,

    ich bastel gerade für die Uni an einer App, die mit einem Server kommuniziert.
    Der Server läuft und die App ebenfalls.

    Leider führt die Socket-Verbindung auf einen Win7-Rechner, der durch eine Firewall geschützt ist zu einem BufferOverflow, da der Windows-7-Rechner wohl auf die Eingabe von Username und Passwort wartet..

    Ich fange schon eine UnknownHost- und I/O-Exception ab aber das hilft in diesem Fall leider nicht.

    Mein Code Abschnitt:
    Code:
    try {
                echoSocket = new Socket(ipAdress, port);
    
                out = new PrintWriter(echoSocket.getOutputStream(), true);
                in2 = new BufferedReader(new InputStreamReader(echoSocket
                        .getInputStream()));
    
                connected = true;
                System.out.println("OUTPUT: " + in2.readLine());
                
            } catch (UnknownHostException e) {
                System.out.println("UnknownHost");
                connected = false;
            } catch (IOException e) {
                System.out.println("I/O-Exception");
                connected = false;
            }
    
    Kann ich dies irgendwie abfangen?
    Eine Exception wird mit im DBMS-LogCat leider nicht ausgeben..
    Da Handy arbeitet halt und läuft irgendwann in den Overflow..


    Viele Grüße
    Chris
     
  2. Maddi, 06.12.2011 #2
    Maddi

    Maddi Android-Hilfe.de Mitglied

    Beiträge:
    82
    Erhaltene Danke:
    10
    Registriert seit:
    18.07.2010
    Kommt der BufferOverflow auf dem WIN7-Rechner oder auf deinem Handy?
     
    ChrisMobile bedankt sich.
  3. ChrisMobile, 06.12.2011 #3
    ChrisMobile

    ChrisMobile Threadstarter Android-Experte

    Beiträge:
    529
    Erhaltene Danke:
    74
    Registriert seit:
    17.03.2010
    Phone:
    HTC One X
    Auf dem Handy.

    Ich konnte es nun aber schon etwas weiter eingrenzen.
    Es ist doch kein BufferOverflow, obwohl es sich ganz ähnlich verhält!
    Die Last steigt jedoch nicht, dazu habe ich unten ein Ausschnitt aus dem LogCat ausgelöst.
    Im LogCat bekomme ich nach dem starten der App nur die Meldung: keyDispatchingTimedOut (Log ist unten).

    Das Problem ist, dass sich das Handy dank der Win7-Firewall nicht mit dem Rechner verbinden kann aber eben auch keine UnknownHostException auftritt.
    Die GUI ist natürlich eingefrohrern und nix geht mehr, bis Android fragt o die App beendet werden soll.

    Natürlich kann ich alles in einen Thread auslagern aber es kommt dank Firewall eben gar keine Verbindung zu Stande, gibt es eine Möglichkeit nur für den Verbindungsversuch ein Timeout anzugeben?

    Wenn die Firewall abgestellt wird, klappt es ohne Probleme.

    Code:
    12-05 16:24:31.664: E/ActivityManager(194): ANR in de.uni.sCg.acc (de.uni.sCg.acc/.Login),  time=64098484
    12-05 16:24:31.664: E/ActivityManager(194): Reason: keyDispatchingTimedOut
    12-05 16:24:31.664: E/ActivityManager(194): Load: 2.81 / 7.87 / 7.41
    12-05 16:24:31.664: E/ActivityManager(194): CPU usage from 25634ms to 0ms ago:
    12-05 16:24:31.664: E/ActivityManager(194):   0.6% 155/akmd: 0% user + 0.6% kernel
    12-05 16:24:31.664: E/ActivityManager(194):   0.4% 194/system_server: 0.1% user + 0.2% kernel / faults: 10 minor 2 major
    12-05 16:24:31.664: E/ActivityManager(194):   0.1% 26362/android.process.media: 0.1% user + 0% kernel / faults: 60 minor
    12-05 16:24:31.664: E/ActivityManager(194):   0% 4/events/0: 0% user + 0% kernel
    12-05 16:24:31.664: E/ActivityManager(194):   0% 60/w1_bus_master1: 0% user + 0% kernel
    12-05 16:24:31.664: E/ActivityManager(194):   0% 73/adbd: 0% user + 0% kernel / faults: 67 minor
    12-05 16:24:31.664: E/ActivityManager(194):   0% 356/com.android.phone: 0% user + 0% kernel / faults: 23 minor
    12-05 16:24:31.664: E/ActivityManager(194):   0% 26339/de.uni.sCg.acc: 0% user + 0% kernel
    12-05 16:24:31.664: E/ActivityManager(194):   0% 57/synaptics_wq: 0% user + 0% kernel
    12-05 16:24:31.664: E/ActivityManager(194):   0% 259/com.android.systemui: 0% user + 0% kernel / faults: 2 minor
    12-05 16:24:31.664: E/ActivityManager(194):   0% 393/dhd_dpc: 0% user + 0% kernel
    12-05 16:24:31.664: E/ActivityManager(194):   0% 418/wpa_supplicant: 0% user + 0% kernel
    12-05 16:24:31.664: E/ActivityManager(194):   0% 23443/com.google.android.apps.maps:NetworkLocationService: 0% user + 0% kernel / faults: 14 minor
    12-05 16:24:31.664: E/ActivityManager(194):   0% 25665/com.google.android.apps.unveil: 0% user + 0% kernel
    12-05 16:24:31.664: E/ActivityManager(194):   0% 26396/logcat: 0% user + 0% kernel / faults: 1 minor
    12-05 16:24:31.664: E/ActivityManager(194): 1.2% TOTAL: 0.4% user + 0.6% kernel + 0% iowait + 0% softirq
    12-05 16:24:31.664: E/ActivityManager(194): CPU usage from 491ms to 1008ms later:
    12-05 16:24:31.664: E/ActivityManager(194):   1.2% 155/akmd: 0% user + 1.2% kernel
    12-05 16:24:31.664: E/ActivityManager(194):   1.9% 194/system_server: 1.9% user + 0% kernel / faults: 1 minor
    12-05 16:24:31.664: E/ActivityManager(194):     3.8% 229/InputDispatcher: 3.8% user + 0% kernel
    12-05 16:24:31.664: E/ActivityManager(194): 3.8% TOTAL: 1.9% user + 1.9% kernel
    
     
  4. ChrisMobile, 07.12.2011 #4
    ChrisMobile

    ChrisMobile Threadstarter Android-Experte

    Beiträge:
    529
    Erhaltene Danke:
    74
    Registriert seit:
    17.03.2010
    Phone:
    HTC One X
    Ich konnte das Problem nun lösen.

    Socket socket = new Socket(ip,port);
    Versucht pausenlos sich zu verbinden, wenn der andere Rechner nicht antwortet (z.B. wegen einer Firewall oder weil einfach nichts passiert) versucht die Methode es immer weiter.

    Die Lösung ist Folgendes:
    Code:
    ...
                //echoSocket = new Socket(ipAdress, port);
                echoSocket = new Socket();
                echoSocket.connect(new InetSocketAddress(ipAdress, port), 2000);
    ...
    
     

Diese Seite empfehlen