1. 获得网络接口名称
2.获取网络接口配置参数
3.获得MTU和MAC
4.获取网卡序号
5.获取发送队列长度
6.获取网络接口IP地址
7.获取网络广播地址
8.查询目的IP地址
9.查询子网掩码
下面是直接在linux系统中可运行的代码
/*
*网络接口的获取
*/
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<net/if_arp.h>
#include<string.h>
#include<linux/sockios.h>
#include<net/if.h>
#include<sys/ioctl.h>
#include<stdlib.h>
#include<unistd.h>
int main(int argc , char *argv[]){
int s; /*套接字描述符*/
int err = -1; /*错误值*/
/*建立数据报套接字*/
s = socket(AF_INET , SOCK_DGRAM , 0);
if(s < 0){
printf("socket() 出错 \n");
return -1;
}
/*获得网络接口名称*/
struct ifreq ifr;
ifr.ifr_ifindex = 4; /*获取第四个(网卡序号为4)网络接口名称*/
err = ioctl(s , SIOCGIFNAME , &ifr);
if(err){
printf("SIOCGIFNAME Error \n");
return -1;
}else{
printf("the %d interface is %s \n" , ifr.ifr_ifindex , ifr.ifr_name);
}
/*获取网络接口配置参数*/
memcpy(ifr.ifr_name , "eno1" , strlen("eno1") + 1);
err = ioctl(s , SIOCGIFFLAGS , &ifr);
if(!err){
printf("SIOCGIFFLAGS:%d \n" , ifr.ifr_flags);
}
/*获得MTU和MAC*/
err = ioctl(s , SIOCGIFMTU , &ifr);
if(!err){
printf("SIOCGIFMTU:%d \n" , ifr.ifr_mtu);
}
err = ioctl(s , SIOCGIFHWADDR , &ifr);
if(!err){
char *hw = ifr.ifr_hwaddr.sa_data;
printf("SIOCGIFHWADDR: %02X : %02X : %02X : %02X : %02X : %02X \n" , hw[0] , hw[1],hw[2] , hw[3],hw[4] , hw[5]);
}
/*获取网卡序号*/
err = ioctl(s , SIOCGIFINDEX , &ifr);
if(!err){
printf("网卡序号:%d \n" , ifr.ifr_ifindex);
}
/*获取发送队列长度*/
err = ioctl(s , SIOCGIFTXQLEN , &ifr);
if(!err){
printf("发送队列长度:%d \n" , ifr.ifr_qlen);
}
/*获取网络接口IP地址*/
struct sockaddr_in *sin = (struct sockaddr_in*)&ifr.ifr_addr; //方便操作设置指向sockaddr_in的指针
char ip[16]; //保存IP地址字符串
memset(ip , 0 , 16);
memcpy(ifr.ifr_name , "eno1" , strlen("eno1") + 1);
err = ioctl(s , SIOCGIFADDR , &ifr);
if(!err){
inet_ntop(AF_INET , &sin->sin_addr.s_addr , ip , 16);
printf("IP地址为:%s \n" , ip);
}
/*获取网络广播地址*/
err = ioctl(s , SIOCGIFBRDADDR , &ifr);
if(!err){
inet_ntop(AF_INET , &sin->sin_addr.s_addr , ip , 16);
printf("广播地址为:%s \n" , ip);
}
/*查询目的IP地址*/
err = ioctl(s , SIOCGIFDSTADDR , &ifr);
if(!err){
inet_ntop(AF_INET , &sin->sin_addr.s_addr , ip , 16);
printf("目的IP地址为:%s \n" , ip);
}
/*查询子网掩码*/
err = ioctl(s , SIOCGIFNETMASK , &ifr);
if(!err){
inet_ntop(AF_INET , &sin->sin_addr.s_addr , ip , 16);
printf("子网掩码:%s \n" , ip);
}
return 0;
}