ioctl()函数的详解:http://blog.csdn.net/shanshanpt/article/details/19897897
ioctl和struct ifreq:http://blog.csdn.net/shanshanpt/article/details/19897897
ioctl在socket中的一些用法及示例 ,控制网络文件:http://blog.chinaunix.net/uid-20692625-id-3172833.html
————————————————————————————————————
函数 : ioctl(int fd, int request, void * arg)
定义 : <sys/ioctl.h>
功能 : 控制I/O设备, 提供了一种获得设备信息和向设备发送控制参数的手段.
参数 :int fd 文件句柄. 用于socket时, 是socket套接字.
int request 函数定义的所有操作. 关于socket的操作, 定义在<linux/sockios.h>文件中.
void *arg 指针的类型依赖于request参数.
getip.c:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<net/if.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
int main (int argc, char **argv)
{
struct sockaddr_in *addr;
struct ifreq ifr;
char *address;
int sockfd;
unsigned char hd[10];
char *name = "eth0";
if(strlen(name) >= IFNAMSIZ)
{
printf("device error\n");
exit(0);
}
strcpy(ifr.ifr_name,name);
sockfd = socket(AF_INET,SOCK_DGRAM,0);
if(ioctl(sockfd,SIOCGIFADDR,&ifr) == -1)
{
printf("ioctl error\n");
exit(0);
}
addr = (struct sockaddr_in *)&(ifr.ifr_addr);
address = inet_ntoa(addr->sin_addr);
printf("IP:%s\n",address);
if(ioctl(sockfd,SIOCGIFNETMASK,&ifr) == -1)
{
printf("ioctl error\n");
exit(0);
}
addr = (struct sockaddr_in *)&(ifr.ifr_addr);
address = inet_ntoa(addr->sin_addr);
printf("Mask: %s\n",address);
if(ioctl(sockfd,SIOCGIFHWADDR,&ifr) == -1)
{
printf("ioctl error\n");
exit(0);
}
memcpy(hd,ifr.ifr_hwaddr.sa_data,sizeof(hd));
printf("HWaddr:%02X:%02X:%02X:%02X:%02X:%02X\n",hd[0],hd[1],hd[2],hd[3],hd[4],hd[5]);
return 0;
} /* ----- End of main() ----- */
测试结果: