Home Code-Schnipsel Netzwerk, Internetverbindung, WLAN, UMTS Abfragen ob eine Verbindung zu einem Netzwerk besteht bzw. hergestellt werden kann

iPhone Gewinnspiel

Abfragen ob eine Verbindung zu einem Netzwerk besteht bzw. hergestellt werden kann PDF Drucken E-Mail
Share
Geschrieben von: Philipp   
TUESDAY, 05 JANUARY 2010 17:26
Wer wissen möchte ob sein iPhone oder iPod touch eine Verbindung in ein Netzwerk (z.B. Internet) aufbauen kann (egal ob UMTS, GPRS oder WLAN) nutzt folgende Funktion. Diese basiert auf dem Apple - Beispiel "Reachbility".

Dieses Beispiel ist zwar wesentlich genauer und hat den Vorteil, das die Applikation mithilfe des Notification-Centers über Änderungen des Netzwerkstatus informiert werden kann, ist jedoch für den jenigen der einfach nur wissen möchte ob eine Verbindung zum Internet möglich ist relativ komplex.

Also eine Zusammenfassung des Apple-Beispiels in einer Funktion sieht dann wie folgt aus:
#import <UIKit/UIKit.h>
#import <SystemConfiguration/SystemConfiguration.h>
#import <netinet/in.h>
#import <SystemConfiguration/SCNetworkReachability.h>

typedef enum {
    ENetworkStateNotReachable = 0,
    ENetworkStateReachableViaWiFi,
    ENetworkStateReachableViaWWAN
} NetworkStatus;


NetworkStatus IsNetworkConnectionAvailable()
{
    NetworkStatus netStatus = ENetworkStateNotReachable;
    
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;
    
    SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)&zeroAddress);
    
    // get Network status
    SCNetworkReachabilityFlags flags;
    if (SCNetworkReachabilityGetFlags(reachability, &flags))
    {
        if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
        {
            // if target host is not reachable
            netStatus = ENetworkStateNotReachable;
        }
        else
        {
           
            if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
            {
                // if target host is reachable and no connection is required
                //  then we'll assume (for now) that your on Wi-Fi
                netStatus = ENetworkStateReachableViaWiFi;
            }
           
           
            if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||
                 (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))
            {
                // ... and the connection is on-demand (or on-traffic) if the
                //     calling application is using the CFSocketStream or higher APIs
               
                if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)
                {
                    // ... and no [user] intervention is needed
                    netStatus = ENetworkStateReachableViaWiFi;
                }
            }
           
            if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
            {
                // ... but WWAN connections are OK if the calling application
                //     is using the CFNetwork (CFSocketStream?) APIs.
                netStatus = ENetworkStateReachableViaWWAN;
            }
           
        }
    }
    
    CFRelease(reachability);
    
    return netStatus;
}

Der gezeigte Code definiert als erstes drei Indentifier vom Typ NetworkStatus. Diese werden dann später von der Funktion IsNetworkConnectionAvailable() als Rückgabewert genutzt.
  • ENetworkStateNotReachable - es besteht NICHT die Möglichkeit der Verbindung in ein Netzwerk
  • ENetworkStateReachableViaWiFi - es kann eine Verbindung über die WiFi-Schnittstelle  (WLAN) hergestellt werden - also es besteht eine Verbindung zu einem WLAN-Router.
  • ENetworkStateReachableViaWWAN - es kann eine Verbindung über die GPRS/UMTS-Schnittstelle hergestellt werden - es besteht also eine Verbindung zum Mobilfunk-Provider.
Die Funktion IsNetworkConnectionAvailable() macht nichts anderes als eine Socket-Adresse vom Typ AF_INET festzulegen und mithilfe von SCNetworkReachabilityCreateWithAddress() deren Konektierbarkeit zu testen. Daraus erfolgt eine Auswertung und der Rückgabewert wird definiert. 

Ihren Kommentar hinzufügen

Ihr Name:
Ihre Webseite:
Betreff:
Kommentar:
  Bild, welches den Sicherheitscode enthält
Sicherheitscode:
LAST_UPDATED2