嵌入式 hi3518平台获取网络环境中的ip、netmask、broadcast等信息

本文提供了一个C语言实现的程序,用于在Linux环境下获取嵌入式hi3518平台上的网络接口信息,包括IP地址、子网掩码、广播地址和MAC地址。通过使用socket和ioctl系统调用,程序可以读取并显示网络接口的详细状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<span style="font-family:Courier New;">
/********************************** (C) COPYRIGHT *******************************
 * File Name          : get_netinfo.c
 * Author              : skdkjzz
 * Date                 : 2014/08/07
 * Description        : linux下获取网卡信息
 *********************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <linux/if.h>
#include <arpa/inet.h>
#include <linux/sockios.h>

int main(int argc,char*argv[]){
	int s;
	int err;
	s=socket(AF_INET,SOCK_DGRAM,0);
	if(s<0){
		perror("socket error");
		return;
	}

	struct ifreq ifr;
#if 1
	memset(&ifr,0,sizeof(ifr));
	ifr.ifr_ifindex=1;    /* 获得第1个网络接口的名称 */

	err=ioctl(s,SIOCGIFNAME,&ifr);
	if(err)
	{
		perror("index error");
	}else
	{
		printf("----------------------------------\n");
		printf("The %dst net device is : %s\n",ifr.ifr_ifindex,ifr.ifr_name);
	}

	err=ioctl(s,SIOCGIFHWADDR,&ifr);   /* 获得MAC地址 */
	printf("%s:[%d] err is %d\n",__FUNCTION__,__LINE__,err);
	if(!err)
	{
		unsigned char* hw=ifr.ifr_hwaddr.sa_data;
		printf("Mac address is : %02x:%02x:%02x:%02x:%02x:%02x\n",hw[0],hw[1],hw[2],hw[3],hw[4],hw[5]);
	}
	else
	{
		printf("Mac address is : 00:00:00:00:00:00\n");
	}

	struct sockaddr_in *sin=(struct sockaddr_in*)&ifr.ifr_addr; /* 获取网络接口IP保存的是二进制IP */
	char ip[16];   /* 字符数组,存放字符串 */
	memset(ip,0,16);
	err=ioctl(s,SIOCGIFADDR,&ifr);
	if(!err)
	{
		inet_ntop(AF_INET,&sin->sin_addr.s_addr,ip,16);  /* 转换的字符串保存到ip数组中,第二个参数是要转换的二进制IP指针,第三个参数是转换完成存放IP的缓冲区,最后一个参数是缓冲区的长度 */
		printf("IP address is : %s\n",ip);
	}else
	{
		printf("IP address is : 0.0.0.0\n");
	}

	err=ioctl(s,SIOCGIFBRDADDR,&ifr);   /* 得到接口的广播地址 */
	if(!err)
	{
		struct sockaddr_in *broadcast=(struct sockaddr_in*)&ifr.ifr_broadaddr;

		inet_ntop(AF_INET,&broadcast->sin_addr.s_addr,ip,16); /* 转换成字符串,inet_ntop将二进制IP转换成点分十进制的字符串 */
		printf("BROADCAST IP is : %s\n",ip);
	}else
	{
		printf("BROADCAST IP is : 0.0.0.0\n",ip);
	}
	printf("----------------------------------\n");

#else

	memset(&ifr,0,sizeof(ifr));
	ifr.ifr_ifindex=2;  /* 获得第2个网络接口的名称 */

	err=ioctl(s,SIOCGIFNAME,&ifr);
	memcpy(ifr.ifr_name,argv[1],5);
	if(err){
		perror("index error");
	}else{
		printf("The %dst net device is : %s\n",ifr.ifr_ifindex,ifr.ifr_name);
	}


	err=ioctl(s,SIOCGIFHWADDR,&ifr);  /* 获得MAC地址 */
	if(!err){
		unsigned char* hw=ifr.ifr_hwaddr.sa_data;
		printf("Mac address is : %02x:%02x:%02x:%02x:%02x:%02x\n",hw[0],hw[1],hw[2],hw[3],hw[4],hw[5]);
	}else{
		printf("Mac address is : 00:00:00:00:00:00\n");
	}

	sin=(struct sockaddr_in*)&ifr.ifr_addr;
	memset(ip,0,16);
	err=ioctl(s,SIOCGIFADDR,&ifr);
	if(!err){
		inet_ntop(AF_INET,&sin->sin_addr.s_addr,ip,16);
		printf("IP address is : %s\n",ip);
	}else{
		printf("IP address is : 0.0.0.0\n");
	}

	err=ioctl(s,SIOCGIFBRDADDR,&ifr);  /* 得到接口的广播地址 */
	if(!err){
		struct sockaddr_in *broadcast=(struct sockaddr_in*)&ifr.ifr_broadaddr;
		inet_ntop(AF_INET,&broadcast->sin_addr.s_addr,ip,16);/* 转换成字符串,inet_ntop将二进制IP转换成点分十进制的字符串 */
		printf("BROADCAST IP is : %s\n",ip);
	}else{
		printf("BROADCAST IP is : 0.0.0.0\n",ip);
	}
#endif

	printf("----------------------------------\n");
	close(s);
	
}
</span>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值