linux中读取网卡信息(ip, mask, mac)以及判断物理网线是否插好的C程序---我亲自试了一下,还不错!

本文主要是介绍linux中读取网卡信息(ip, mask, mac)以及判断物理网线是否插好的C程序---我亲自试了一下,还不错!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      说明: 我主要转载如下两篇文章, 但本文中加入了自己的一些描述微笑

 

      转载地址一: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

 

 

 

socket最常用到的结构体: struct ifreq 定义在<net/if.h>.(包括struct ifconf/ifr_flags等的定义)

       程序为:

 

#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 addrif( 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 Maskif( 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中读取网卡信息(ip, mask, mac)以及判断物理网线是否插好的C程序---我亲自试了一下,还不错!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/684644

相关文章

Linux CPU飙升排查五步法解读

《LinuxCPU飙升排查五步法解读》:本文主要介绍LinuxCPU飙升排查五步法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录排查思路-五步法1. top命令定位应用进程pid2.php top-Hp[pid]定位应用进程对应的线程tid3. printf"%

Linux下安装Anaconda3全过程

《Linux下安装Anaconda3全过程》:本文主要介绍Linux下安装Anaconda3全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录简介环境下载安装一、找到下载好的文件名为Anaconda3-2018.12-linux-x86_64的安装包二、或者通

Linux系统之stress-ng测压工具的使用

《Linux系统之stress-ng测压工具的使用》:本文主要介绍Linux系统之stress-ng测压工具的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、理论1.stress工具简介与安装2.语法及参数3.具体安装二、实验1.运行8 cpu, 4 fo

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创

Python程序的文件头部声明小结

《Python程序的文件头部声明小结》在Python文件的顶部声明编码通常是必须的,尤其是在处理非ASCII字符时,下面就来介绍一下两种头部文件声明,具有一定的参考价值,感兴趣的可以了解一下... 目录一、# coding=utf-8二、#!/usr/bin/env python三、运行Python程序四、

Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法

《Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法》在Linux系统中,管理磁盘设备和分区是日常运维工作的重要部分,而lsblk命令是一个强大的工具,它用于列出系统中的块设备(blockde... 目录1. 查看所有磁盘的物理信息方法 1:使用 lsblk(推荐)方法 2:使用 fdisk -l(

Linux中的more 和 less区别对比分析

《Linux中的more和less区别对比分析》在Linux/Unix系统中,more和less都是用于分页查看文本文件的命令,但less是more的增强版,功能更强大,:本文主要介绍Linu... 目录1. 基础功能对比2. 常用操作对比less 的操作3. 实际使用示例4. 为什么推荐 less?5.

Mac备忘录怎么导出/备份和云同步? Mac备忘录使用技巧

《Mac备忘录怎么导出/备份和云同步?Mac备忘录使用技巧》备忘录作为iOS里简单而又不可或缺的一个系统应用,上手容易,可以满足我们日常生活中各种记录的需求,今天我们就来看看Mac备忘录的导出、... 「备忘录」是 MAC 上的一款常用应用,它可以帮助我们捕捉灵感、记录待办事项或保存重要信息。为了便于在不同

电脑蓝牙连不上怎么办? 5 招教你轻松修复Mac蓝牙连接问题的技巧

《电脑蓝牙连不上怎么办?5招教你轻松修复Mac蓝牙连接问题的技巧》蓝牙连接问题是一些Mac用户经常遇到的常见问题之一,在本文章中,我们将提供一些有用的提示和技巧,帮助您解决可能出现的蓝牙连接问... 蓝牙作为一种流行的无线技术,已经成为我们连接各种设备的重要工具。在 MAC 上,你可以根据自己的需求,轻松地

如何关闭Mac的Safari通知? 3招教你关闭Safari浏览器网站通知的技巧

《如何关闭Mac的Safari通知?3招教你关闭Safari浏览器网站通知的技巧》当我们在使用Mac电脑专注做一件事情的时候,总是会被一些消息推送通知所打扰,这时候,我们就希望关闭这些烦人的Mac通... Safari 浏览器的「通知」功能本意是为了方便用户及时获取最新资讯,但很容易被一些网站滥用,导致我们