linux下应用程序里面如何通过ioctl函数获取u盘信息,Linux下利用ioctl函数获取网卡信息...

linux下的ioctl函数原型如下:

#include

int ioctl(int handle, int cmd, [int *argc, int argv])

函数成功返回0,失败返回-1.

其相关命令接口如下:

类别Request说明数据类型

口SIOCATMARK

SIOCSPGRP

SIOCGPGRP是否位于带外标记

设置套接口的进程ID 或进程组ID

获取套接口的进程ID 或进程组IDint

int

int

件FIONBIO

FIOASYNC

FIONREAD

FIOSETOWN

FIOGETOWN设置/ 清除非阻塞I/O 标志

设置/ 清除信号驱动异步I/O 标志

获取接收缓存区中的字节数

设置文件的进程ID 或进程组ID

获取文件的进程ID 或进程组IDint

int

int

int

int

口SIOCGIFCONF

SIOCSIFADDR

SIOCGIFADDR

SIOCSIFFLAGS

SIOCGIFFLAGS

SIOCSIFDSTADDR

SIOCGIFDSTADDR

SIOCGIFBRDADDR

SIOCSIFBRDADDR

SIOCGIFNETMASK

SIOCSIFNETMASK

SIOCGIFMETRIC

SIOCSIFMETRIC

SIOCGIFMTU

SIOCxxx获取所有接口的清单

设置接口地址

获取接口地址

设置接口标志

获取接口标志

设置点到点地址

获取点到点地址

获取广播地址

设置广播地址

获取子网掩码

设置子网掩码

获取接口的测度

设置接口的测度

获取接口MTU

(还有很多取决于系统的实现)struct ifconf

struct ifreq

struct ifreq

struct ifreq

struct ifreq

struct ifreq

struct ifreq

struct ifreq

struct ifreq

struct ifreq

struct ifreq

struct ifreq

struct ifreq

struct ifreq

ARPSIOCSARP

SIOCGARP

SIOCDARP创建/ 修改ARP 表项

获取ARP 表项

删除ARP 表项struct arpreq

struct arpreq

struct arpreq

由SIOCADDRT

SIOCDELRT增加路径

删除路径struct rtentry

struct rtentry

在这里我们需要用到的结构体

#include

struct sockaddr_in {

short sin_family; /* Address family */

unsigned short sin_port; /* Port number */

structin_addrsin_addr; /* Internet address */

unsigned char sin_zero[8]; /* Same size as struct sockaddr */

};

#include

structifreq

{#defineIFHWADDRLEN6

union

{charifrn_name[IFNAMSIZ];} ifr_ifrn;union{structsockaddr ifru_addr;structsockaddr ifru_dstaddr;structsockaddr ifru_broadaddr;structsockaddr ifru_netmask;structsockaddr ifru_hwaddr;shortifru_flags;intifru_ivalue;intifru_mtu;structifmap ifru_map;charifru_slave[IFNAMSIZ];charifru_newname[IFNAMSIZ];void__user *ifru_data;structif_settings ifru_settings;} ifr_ifru;

};

#defineifr_nameifr_ifrn.ifrn_name#defineifr_hwaddrifr_ifru.ifru_hwaddr#defineifr_addrifr_ifru.ifru_addr#defineifr_dstaddrifr_ifru.ifru_dstaddr#defineifr_broadaddrifr_ifru.ifru_broadaddr#defineifr_netmaskifr_ifru.ifru_netmask#defineifr_flagsifr_ifru.ifru_flags#defineifr_metricifr_ifru.ifru_ivalue#defineifr_mtuifr_ifru.ifru_mtu#defineifr_mapifr_ifru.ifru_map#defineifr_slaveifr_ifru.ifru_slave#defineifr_dataifr_ifru.ifru_data#defineifr_ifindexifr_ifru.ifru_ivalue#defineifr_bandwidthifr_ifru.ifru_ivalue#defineifr_qlenifr_ifru.ifru_ivalue#defineifr_newnameifr_ifru.ifru_newname#defineifr_settingsifr_ifru.ifru_setting

ioctl函数能获取到IP地址、子网掩码、广播地址、硬件MAC地址等信息,至于网关及路由表比较复杂,在此不讨论。

具体代码如下:(测试通过)

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

int main()

{

struct sockaddr_in *sin;

struct ifreq ifr;

FILE *dns;

FILE *gw;

char *ip = new char(16);

char *netmask = new char(16);

char *broadcast = new char(16);

//char *ip = (char *)malloc(16);

char *mac = new  char(32);

//char *mac = (char *)malloc(32);

int socket_fd;

if((socket_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0){

perror("socket");

exit(1);

}

memset(&ifr, 0, sizeof(ifr));

strcpy(ifr.ifr_name, "eth0");

memset(&sin, 0, sizeof(sin));

//获取IP地址

if(ioctl(socket_fd, SIOCGIFADDR, &ifr) != -1){

sin = (struct sockaddr_in *)&ifr.ifr_addr;

strcpy(ip, inet_ntoa(sin->sin_addr));

printf("IP address is %s\n", ip);

}

//获取广播地址

if(ioctl(socket_fd, SIOCGIFBRDADDR, &ifr) != -1){

sin = (struct sockaddr_in *)&ifr.ifr_broadaddr;

strcpy(broadcast, inet_ntoa(sin->sin_addr));

printf("Broadcast is %s\n", broadcast);

}

//获取子网掩码

if(ioctl(socket_fd, SIOCGIFNETMASK, &ifr) != -1){

sin = (struct sockaddr_in *)&ifr.ifr_broadaddr;

strcpy(netmask, inet_ntoa(sin->sin_addr));

printf("Net-mask is %s\n", netmask);

}

//获取硬件MAC地址

if(ioctl(socket_fd, SIOCGIFHWADDR, &ifr) != -1){

sin = (struct sockaddr_in *)&ifr.ifr_netmask;

sprintf(mac, "%02x:%02x:%02x:%02x:%02x:%02x",

(unsigned char)ifr.ifr_netmask.sa_data[0],

(unsigned char)ifr.ifr_netmask.sa_data[1],

(unsigned char)ifr.ifr_netmask.sa_data[2],

(unsigned char)ifr.ifr_netmask.sa_data[3],

(unsigned char)ifr.ifr_netmask.sa_data[4],

(unsigned char)ifr.ifr_netmask.sa_data[5]);

printf("Mac address is %s\n", mac);

}

return 0;

}

至于获取网关以及DNS,我是通过相关命令获得的。

主要代码如下:

//获取网关,利用route -n 命令可以看到相关的网关。连接标志是‘UG’

if(gw_fd = popen("route -n | grep 'UG'", "r")){

fread(temp,1,128, gw_fd);

sscanf(temp, "%*s%s", szNetGate);

printf("Gateway is %s\n", szNetGate);

}

//获取DNS;一般DNS保存在/etc/reslov.conf文件中。具体获得方法要根据实际情况而定。

我的配置文件中是这样的

root@nill:/home/arm-none-linux# cat /etc/resolv.conf

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)

#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN

nameserver 202.96.134.133

上面的202.96.134.133就是我需要获取的主DNS,没有备用DNS

if(dns_fd = popen("cat /etc/reslov.conf | grep 'nameserver'", "r")){

fread(temp,1,128, gw_fd);

sscanf(temp, "%*s%s%*s%s", szDNS1,szDNS2);

printf("DNS1 is %s",szDNS1);

printf("DNS2is %s", szDNS2);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux读取U盘或者移动硬盘序列号并获取U盘或者移动硬盘分区名。基本原理如下: 当有外置 USB 插入的时候,会产生 /proc/scsi/usb-storage 目录,并在其中产生数字文件(形如 1 2 3 4),此文件存储了设备相关信息。 相应的 /sys/class/scsi_device/ 目录中会有 scsi 设备的目录(ide 硬盘默认无子目录,sata硬盘默认有子目录),以数字开头(形如 1:0:0:0 2:0:0:0) 这个数字与前面 /proc/scsi/usb-storage目录中的相对应,子目录表示sata硬盘。比如 /sys/class/scsi_device/2:0:0:0/device/block 中有USB设备,从该目录下得到U盘或者移动硬盘的分区名,比如sda1。 该demo实现了上述过程,先检查 /proc/scsi/usb-storage 目录,看是否有u盘或者移动硬盘接入,如果有则读取u盘或者移动硬盘的序列号,然后在/sys/class/scsi_device/目录下逐级查找,直到找到u盘或者移动硬盘的分区。 完整代码,可直接编译和测试,嵌入式环境下也是适应的。 在linux测试如下,id表示序列号,sdb1表示是分区名称: # ./a.out udisk dev num:0 udisk id:055CE21B ret:0 dev num:0 found dir:0:0:0:1 found dev dir:0:0:0:1,full path:/sys/class/scsi_device/0:0:0:1 sub founction found dir:sda found sd device dir:sda,full path:/sys/class/scsi_device/0:0:0:1/device/block/sda found dir:0:0:0:2 found dev dir:0:0:0:2,full path:/sys/class/scsi_device/0:0:0:2 sub founction found dir:sdb found sd device dir:sdb,full path:/sys/class/scsi_device/0:0:0:2/device/block/sdb found sd sub device dir:sdb1 found dir:0:0:0:0 found dev dir:0:0:0:0,full path:/sys/class/scsi_device/0:0:0:0 sub funciton Open Directory /sys/class/scsi_device/0:0:0:0/device/block Error:No such file or directory get name return:0,disk name:sdb1 # 因为有的USB设备会有好几个,比如把CD和U盘集成到一起,就会出现上面的情况,有多个子目录去查找。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值