不用尝试了,直接不支持。
1.可能可使用的接口:
ioctl()
system()
验证:
原理:
控制驱动干的事?
ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支持,用户就可以在用户程序中使用ioctl函数来控制设备的I/O通道。
直接在shell下,用ifconfig wlan0 192.168.0.66 设置,可以的。但需要两次,如果写在可执行文件里则只需要一次?不是,都要延迟一次?为什么呢?设置后,立马用netcfg查,发现设置的是是一个的递延,不知道为何。
如何解决:
为何同样代码,在shell中可以正常执行,得出设置结果,细节:设置第二次才生效,第一次时先复原为设备原先的Ip。第二次才成功成原先地址设成新的地址?
adb shell 是用了什么权限呢?
普通的app进程呢?
同执行ioctl,为什么一个返回0,一个返回失败的-1?
答案:不支持。
整个gecko用到system()的部分才这么多。
层次太靠上了,没有权限执行这些操作。这个需求不合理,对整个系统有害。
一般都在hal或hardware层才会用,你现在要求我在app内用,越权级别太大,无法做到,不支持。
android也是如此:
http://bbs.21ic.com/icview-1596730-1-1.html
#include <unistd.h>
#include <stdbool.h>
#include <android/log.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <net/if.h>
#define ADHOCLOG_PMT(fmt, ...) __android_log_print(ANDROID_LOG_WARN,
"ADHOCLOG_PMT", "%12s:%-5d,%s ," fmt, __FILE__,
__LINE__ ,(char*)__FUNCTION__,##__VA_ARGS__)
/*wlan0*/
/*printf("=%d\n",);*/
/*#define ETH_NAME "eth0" //getip failed!*/
#define ETH_NAME "wlan0"
int getip_not_r()
{
int sock;
struct sockaddr_in sin;
struct ifreq ifr;
unsigned char arp[6] ;
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == -1)
{
perror("socket");
return -1;
}
printf("sock=%d\n",sock);
strncpy(ifr.ifr_name, ETH_NAME, IFNAMSIZ);
ifr.ifr_name[IFNAMSIZ - 1] = 0;
int ior=ioctl( sock, SIOCGIFHWADDR, &ifr );
printf("ior=%d\n",ior);
if (ioctl(sock, SIOCGIFADDR, &ifr) == 0) //获取ip
{
memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
fprintf(stdout, "eth0: %s\n", inet_ntoa(sin.sin_addr));
}
if( ioctl( sock, SIOCGIFHWADDR, &ifr ) == 0 ) //获取mac
{
memcpy( arp, ifr.ifr_hwaddr.sa_data, 6 );
printf( "adapter hardware address %x:%x:%x:%x:%x:%x\n",
arp[0], arp[1], arp[2], arp[3], arp[4], arp[5] );
}
printf("sock=%d\n",sock);
return 0;
}
//设置IP地址
/*
* 函数名称 : int setip(char *ip)
* 函数功能 : 设置系统IP地址
* 参 数 :
*char *ip :设置的IP地址,以点分十进制的字符串方式表示,如“192.168.0.5”
* 返 回 值 : 0 : 成功 ; -1 : 失败
*/
int setip(char *ip)
{
struct ifreq temp;
struct sockaddr_in *addr;
int fd = 0;
int ret = -1;
/*strcpy(temp.ifr_name, "eth0");*/
strcpy(temp.ifr_name, "wlan0");
if((fd=socket(AF_INET, SOCK_STREAM, 0))<0)
{
return -1;
}
addr = (struct sockaddr_in *)&(temp.ifr_addr);
addr->sin_family = AF_INET;
addr->sin_addr.s_addr = inet_addr(ip);
ret = ioctl(fd, SIOCSIFADDR, &temp);
printf("setip fd=%d\n",fd);
close(fd);
if(ret < 0)
return -1;
return 0;
}
//获取IP地址
/*
* 函数名称 : char * getip(char *ip_buf)
* 函数功能 : 获取系統IP地址
* 参 数 :
*char *ip_buf :用来存放IP地址的内存空间
* 返 回 值 : ip_buf : 存放IP地址的内存地址
*/
char* getip(char *ip_buf)
{
struct ifreq temp;
struct sockaddr_in *myaddr;
int fd = 0;
int ret = -1;
/*strcpy(temp.ifr_name, "eth0");*/
strcpy(temp.ifr_name, "wlan0");
if((fd=socket(AF_INET, SOCK_STREAM, 0))<0)
{
return -1;
}
ret = ioctl(fd, SIOCGIFADDR, &temp);
close(fd);
if(ret < 0)
return NULL;
myaddr = (struct sockaddr_in *)&(temp.ifr_addr);
strcpy(ip_buf, inet_ntoa(myaddr->sin_addr));
printf("ipaddr=%s\n",ip_buf);
return ip_buf;
}
int ip_test()
{
char * ip = "172.20.0.1";
char buf[16]="";
int ret_set=setip(ip);
printf("ret_set=%d\n",ret_set);
printf("get ipaddr=%s\n",getip(buf));
return 0;
}
void sys_call()
{
/*system("ls -al /etc/ /data");*/
system("ls /etc/");
system("netcfg");
}
int main(int argc, char** argv)
{
ADHOCLOG_PMT("\n-----------------------\n");
/*init();*/
/*exccmd();*/
/*sys_call();*/
ip_test();
getip_not_r();
exit(0);
}
解决方案:
放在socket的另一端去执行!
使用daemon ,使其独立运行着。
研:解决app权限不够的问题,用udp socket 放在daemon里执行高权限操作