获取本地ip,mac地址---Linux C

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/localhostcom/article/details/80485165
/*------------------------------------------------------------------
-   Filename      :   getLocalIP.c
-   CreateTime    :   2018-05-28    17:15
-   Author        :   tobiu
-   Description   :   get local ip
------------------------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <unistd.h>

#define IF_NAME "ens33"  //network port

/*************************************
*	@Function : get_local_ip
*	@param	  :
*		ifname	:	network port
*		ip 		:	store data
*	@Description	:	get local ip
*************************************/
int get_local_ip(char *ifname,char *ip)
{
	char *temp = NULL;
	int inet_sock;
	struct ifreq ifr;

	inet_sock = socket(AF_INET,SOCK_DGRAM,0);

	memset(ifr.ifr_name,0,sizeof(ifr.ifr_name));
	memcpy(ifr.ifr_name,ifname,strlen(ifname));

	if(0 != ioctl(inet_sock,SIOCGIFADDR,&ifr))
	{
		perror("ioctl error!");
		return 1;
	}

	temp = inet_ntoa(((struct sockaddr_in*)&(ifr.ifr_addr))->sin_addr);
	memcpy(ip,temp,strlen(temp));

	close(inet_sock);

	return 0;

}


int main(int argc, char const *argv[])
{
	/* code */
	char ip[32] = {0};
	get_local_ip(IF_NAME,ip);

	if(0 != strcmp(ip,""))
	{
		printf("%s ip is : %s \n",IF_NAME,ip );
	}
	return 0;
}


获得mac地址:

int get_local_mac(unsigned char *mac) {
/* get mac interface */
	struct ifreq ifreq;
	int sock;

	if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
		perror("create socket falied...\r\n");
		return -1;
	}
	//strcpy(ifreq.ifr_name, "ens33");
	strcpy(ifreq.ifr_name, "eth0");
	if (ioctl(sock, SIOCGIFHWADDR, &ifreq) < 0) {
		perror("mac ioctl error:");
		return -1;
	}
	memcpy(mac, ifreq.ifr_hwaddr.sa_data, 6);

	printf("%02x:%02x:%02x:%02x:%02x:%02x\n ", (unsigned char) ifreq.ifr_hwaddr.sa_data[0], (unsigned char) ifreq.ifr_hwaddr.sa_data[1], (unsigned char) ifreq.ifr_hwaddr.sa_data[2],
			(unsigned char) ifreq.ifr_hwaddr.sa_data[3], (unsigned char) ifreq.ifr_hwaddr.sa_data[4], (unsigned char) ifreq.ifr_hwaddr.sa_data[5]);

	close(sock);
	return 0;
}

使用到的是结构体:struct ifreq;

struct ifreq
{
#define IFHWADDRLEN 6
 union
 {
  char ifrn_name[IFNAMSIZ];  
 } ifr_ifrn;
 
 union {
  struct sockaddr ifru_addr;
  struct sockaddr ifru_dstaddr;
  struct sockaddr ifru_broadaddr;
  struct sockaddr ifru_netmask;
  struct  sockaddr ifru_hwaddr;
  short ifru_flags;
  int ifru_ivalue;
  int ifru_mtu;
  struct  ifmap ifru_map;
  char ifru_slave[IFNAMSIZ]; 
  char ifru_newname[IFNAMSIZ];
  void __user * ifru_data;
  struct if_settings ifru_settings;
 } ifr_ifru;
};

#define ifr_name ifr_ifrn.ifrn_name 
#define ifr_hwaddr ifr_ifru.ifru_hwaddr 
#define ifr_addr ifr_ifru.ifru_addr 
#define ifr_dstaddr ifr_ifru.ifru_dstaddr 
#define ifr_broadaddr ifr_ifru.ifru_broadaddr 
#define ifr_netmask ifr_ifru.ifru_netmask 
#define ifr_flags ifr_ifru.ifru_flags 
#define ifr_metric ifr_ifru.ifru_ivalue 
#define ifr_mtu  ifr_ifru.ifru_mtu 
#define ifr_map  ifr_ifru.ifru_map 
#define ifr_slave ifr_ifru.ifru_slave 
#define ifr_data ifr_ifru.ifru_data 
#define ifr_ifindex ifr_ifru.ifru_ivalue 
#define ifr_bandwidth ifr_ifru.ifru_ivalue    
#define ifr_qlen ifr_ifru.ifru_ivalue 
#define ifr_newname ifr_ifru.ifru_newname 
#define ifr_settings ifr_ifru.ifru_settings

简单介绍:    ifreq结构定义在/usr/include/net/if.h,用来配置ip地址,激活接口,配置MTU等接口信息的。其中包含了一个接口的名 字和具体内容——(是个共用体,有可能是IP地址,广播地址,子网掩码,MAC号,MTU或其他内容)。ifreq包含在ifconf结构中。而 ifconf结构通常是用来保存所有接口的信息的。

猜你喜欢

转载自blog.csdn.net/localhostcom/article/details/80485165