是否可以同时具有3G和WiFi连接?
是的,这是可能的。您可以通过编程方式检查活动网络接口。例如。使用此代码:
/*
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
,显然系统将使用可用网络的"最佳"。