2016-06-23 7 views
1

Ist es möglich, 3G- und WLAN-Verbindungen gleichzeitig zu haben?Ist es möglich, 3G- und WLAN-Verbindungen gleichzeitig zu haben? sogar mit NDK verwenden?

+0

Nicht, dass ich das wüsste. Wie funktioniert das überhaupt? Es gibt keine API zum Wechseln zwischen verschiedenen aktiven Netzwerkverbindungen. – m02ph3u5

+0

Nein, das weiß ich. Ich kann wissen, welche Verbindung zum Staat besteht oder eine von ihnen erzwingen, aber ich kann nicht beide verbinden. Sie können zum Beispiel mit ConectivityManager und WifiManager – Royal

Antwort

0

Ja, es ist möglich. Sie können aktive Netzwerkschnittstellen programmgesteuert überprüfen. Z.B. mit this Code:

/* 
    Example code to obtain IP and MAC for all available interfaces on Linux. 
    by Adam Pierce <[email protected]> 

http://www.doctort.org/adam/ 

*/ 

#include <sys/ioctl.h> 
#include <net/if.h> 
#include <netinet/in.h> 
#include <stdio.h> 
#include <arpa/inet.h> 

int main(void) 
{ 
    char   buf[1024]; 
    struct ifconf ifc; 
    struct ifreq *ifr; 
    int   sck; 
    int   nInterfaces; 
    int   i; 

/* Get a socket handle. */ 
    sck = socket(AF_INET, SOCK_DGRAM, 0); 
    if(sck < 0) 
    { 
     perror("socket"); 
     return 1; 
    } 

/* Query available interfaces. */ 
    ifc.ifc_len = sizeof(buf); 
    ifc.ifc_buf = buf; 
    if(ioctl(sck, SIOCGIFCONF, &ifc) < 0) 
    { 
     perror("ioctl(SIOCGIFCONF)"); 
     return 1; 
    } 

/* Iterate through the list of interfaces. */ 
    ifr   = ifc.ifc_req; 
    nInterfaces = ifc.ifc_len/sizeof(struct ifreq); 
    for(i = 0; i < nInterfaces; i++) 
    { 
     struct ifreq *item = &ifr[i]; 

    /* Show the device name and IP address */ 
     printf("%s: IP %s", 
       item->ifr_name, 
       inet_ntoa(((struct sockaddr_in *)&item->ifr_addr)->sin_addr)); 

    /* Get the MAC address */ 
     if(ioctl(sck, SIOCGIFHWADDR, item) < 0) 
     { 
      perror("ioctl(SIOCGIFHWADDR)"); 
      return 1; 
     } 

    /* Get the broadcast address (added by Eric) */ 
     if(ioctl(sck, SIOCGIFBRDADDR, item) >= 0) 
      printf(", BROADCAST %s", inet_ntoa(((struct sockaddr_in *)&item->ifr_broadaddr)->sin_addr)); 
     printf("\n"); 
    } 

     return 0; 
} 

Sie können es für Android kompilieren und dann über ADB Shell starten. Auf meinem Gerät gibt es nächste Ausgabe:

[email protected]:/ $ /data/local/tmp/ifenum           
lo: IP 127.0.0.1, BROADCAST 0.0.0.0 
rmnet_usb0: IP 100.105.60.161, BROADCAST 0.0.0.0 
wlan0: IP 192.168.0.100, BROADCAST 192.168.0.255 

Wie Sie sehen können, ist das Gerät mit zwei verschiedenen Netzwerken verbunden ist, und ich kann frei wählen, was zu verwenden. (rmnet_usb0 wird von meinem Mobilfunkbetreiber bereitgestellt und ist tatsächlich ein Edge-Netzwerk, aber IMO 3G endet mit dem gleichen Ergebnis)

P.S. Die meisten Anwendungen interessieren sich nicht für die Schnittstelle, die sie verwenden, und binden ihre Sockets an INADDR_ANY, offensichtlich verwendet das System das "Beste" der verfügbaren Netzwerke.

+0

Okay tnx eine Menge ... Wenn ich alle Netzwerke wie Ihre, bekomme ich Paket (Übertragung) zum Beispiel in 3G und erhalten in WIFI bekommen? Danke für jede Hilfe ... @Serhio – Royal

+0

@Royal Im Allgemeinen - nein. Jeder erstellte Socket verwendet nur eine Netzwerkschnittstelle sowohl zum Senden als auch zum Empfangen. Sie können es umgehen, indem Sie zwei Verbindungen erstellen und diese dann an verschiedene Schnittstellen auf Ihrem Gerät binden. Aber in diesem Fall sollte das entfernte Ende manuell die richtige Verbindung auswählen, von der es Anfragen lesen sollte und auf die es Antworten schreiben soll. – Sergio

Verwandte Themen