linux中读取网卡信息(ip, mask, mac)以及判断物理网线是否插好的C程序---我亲自试了一下,还不错!
2015-03-20 23:44
555 查看
说明: 我主要转载如下两篇文章, 但本文中加入了自己的一些描述
转载地址一:http://blog.chinaunix.net/uid-20692625-id-3172833.html
转载地址二:http://blog.chinaunix.net/uid-8048969-id-3417143.html
在linux系统中, 我们可以通过ifconfig命令来查找网卡信息, 也可以获知物理网线是否插好, 先看地址一中的介绍:
ioctl在socket中的一些用法及示例
函数 : 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参数.
以下表格从网上收集了request - arg指针类型的对应关系
socket最常用到的结构体: struct ifreq 定义在<net/if.h>.(包括struct ifconf/ifr_flags等的定义)
程序为:
好, 我们继续看转载地址二中如何判断物理网线是否插好, 看程序吧(我略微删改了一下):
我们可以通过ifconfig获取网卡的具体信息,并看到网卡对应的物理网络连线是否ok. 当然, 也可以通过上面的两个程序实现该功能。 最后要说一下,网上类似的程序很多很多, 不禁感叹, 互联网真是个好东西。
最后补充一下无线的情况: 如果电脑上的无线网络开关没有打开, 那么上面的ioctl会返回小于0的数值, 如果电脑上的无线网络打开了但没有接入无线, 那就相当于not running, 如果电脑上的无线网络打开了且接入无线,那么就是running状态了。
转载地址一:http://blog.chinaunix.net/uid-20692625-id-3172833.html
转载地址二:http://blog.chinaunix.net/uid-8048969-id-3417143.html
在linux系统中, 我们可以通过ifconfig命令来查找网卡信息, 也可以获知物理网线是否插好, 先看地址一中的介绍:
ioctl在socket中的一些用法及示例
函数 : 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参数.
以下表格从网上收集了request - arg指针类型的对应关系
类别 | Request | 说明 | 数据类型 |
套 接 口 | SIOCATMARK SIOCSPGRP SIOCGPGRP | 是否位于带外标记 设置套接口的进程ID 或进程组ID 获取套接口的进程ID 或进程组ID | int int int |
文 件 | FIONBIN FIOASYNC FIONREAD FIOSETOWN FIOGETOWN | 设置/ 清除非阻塞I/O 标志 设置/ 清除信号驱动异步I/O 标志 获取接收缓存区中的字节数 设置文件的进程ID 或进程组ID 获取文件的进程ID 或进程组ID | int 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 |
ARP | SIOCSARP SIOCGARP SIOCDARP | 创建/ 修改ARP 表项 获取ARP 表项 删除ARP 表项 | struct arpreq struct arpreq struct arpreq |
路 由 | SIOCADDRT SIOCDELRT | 增加路径 删除路径 | struct rtentry struct rtentry |
流 | I_xxx | | |
程序为:
#include "stdio.h" #include "stdlib.h" #include "string.h" #include "net/if.h" #include "arpa/inet.h" #include "linux/sockios.h" int main(int argc,char *argv[]) { struct sockaddr_in *addr; struct ifreq ifr; char*address; int sockfd; char *name = "eth0"; if( strlen(name) >= IFNAMSIZ) printf("device name is error.\n"), exit(0); strcpy( ifr.ifr_name, name); sockfd = socket(AF_INET,SOCK_DGRAM,0); //get inet addr 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("inet addr: %s\n",address); //get Mask 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); //get HWaddr u_int8_t hd[6]; if(ioctl(sockfd, SIOCGIFHWADDR, &ifr) == -1) printf("hwaddr 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]); exit(0); }我试过了, 这个程序用gcc编译是ok的, 且能正确读取网卡信息。
好, 我们继续看转载地址二中如何判断物理网线是否插好, 看程序吧(我略微删改了一下):
#include <stdio.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <errno.h> #include <linux/if_ether.h> #include <net/if.h> #include <sys/ioctl.h> #include <string.h> #define ETH_NAME "eth0" int check_nic(void) { struct ifreq ifr; int skfd = socket(AF_INET, SOCK_DGRAM, 0); strcpy(ifr.ifr_name, ETH_NAME); if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0) { close(skfd); return -1; } if(ifr.ifr_flags & IFF_RUNNING){ printf("link up\n"); close(skfd); return 0; // 网卡已插上网线 }else { printf("link down\n"); close(skfd); return -1; } } int main(void) { check_nic(); return 0; }我用gcc编译并测试了一下, 确实可以看到物理连线是否ok.
我们可以通过ifconfig获取网卡的具体信息,并看到网卡对应的物理网络连线是否ok. 当然, 也可以通过上面的两个程序实现该功能。 最后要说一下,网上类似的程序很多很多, 不禁感叹, 互联网真是个好东西。
最后补充一下无线的情况: 如果电脑上的无线网络开关没有打开, 那么上面的ioctl会返回小于0的数值, 如果电脑上的无线网络打开了但没有接入无线, 那就相当于not running, 如果电脑上的无线网络打开了且接入无线,那么就是running状态了。
相关文章推荐
- Linux 下获取LAN中指定IP的网卡的MAC(物理地址)
- linux 系统获取网络ip, mask, gateway, dns信息小程序
- 自己写的获取网卡信息(MAC,IP等)小程序
- 读取网卡信息IP,MAC的GetAdaptersInfo函数
- Linux 下获取LAN中指定IP的网卡的MAC(物理地址)
- Linux 如何判断哪个网卡是否连接网线
- 监测程序详细介绍,快捷键的设置;txt文件里面一行行的读取、删除、添加字符串等;根据程序路径名以及程序名判断程序是否在运行;
- 登录时验证,判断服务器IP和网卡信息是否授权
- linux 系统获取网络ip, mask, gateway, dns信息小程序
- 如何获取网卡相关信息(包括mac, ip, mask, gateway等)?---利用GetAdaptersInfo
- 如何判断linux下物理cpu数,核数以及是否支持超线程
- asp程序 读取某IP的网卡MAC地址
- linux下的shell命令的编写,以及java如何调用linux的shell命令(java如何获取linux上的网卡的ip信息)
- linux 系统获取网络ip, mask, gateway, dns信息小程序
- Linux 下获取LAN中指定IP的网卡的MAC(物理地址)
- windows获取网卡信息并判断是否是物理网卡 网络适配器的判断
- linux下的shell命令的编写,以及java怎样调用linux的shell命令(java怎样获取linux上的网卡的ip信息)
- 获取网卡信息(MAC,IP等)小程序
- 获取本机所有网卡的网卡名、网卡描述、网卡MAC地址、网卡IP、网卡类型等信息及网线是否插入状态
- VC++获取系统信息/获取OS/获取MAC/获取本地IP/判断是否为网吧