是否有可能同时拥有3G和Wifi连接?甚至使用NDK?

时间:2016-06-23 21:15:46

标签: android android-ndk android-wifi 3g

是否可以同时拥有3G和Wifi连接?

1 个答案:

答案 0 :(得分:0)

是的,有可能。您可以通过编程方式检查活动网络接口。例如。使用this代码:

/*
  Example code to obtain IP and MAC for all available interfaces on Linux.
  by Adam Pierce <adam@doctort.org>

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;
}

您可以为Android编译它,然后通过ADB shell启动。在我的设备上,它提供下一个输出:

shell@mako:/ $ /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

如您所见,我的设备连接到两个不同的网络,我可以自由选择使用的设备。 (rmnet_usb0由我的移动运营商提供,实际上是边缘网络,但IMO 3G以相同的结果结束)

P.S。大多数应用程序不关心他们使用的接口并将其套接字绑定到INADDR_ANY,显然系统将使用&#34; best&#34;可用的网络。