Linux C 网络编程 - 获取本地 ip 地址,mac,通过域名获取对应的 ip 、获取本地主机的名字

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

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <errno.h>  
#include <unistd.h>  
  
#include <netdb.h>  
#include <net/if.h>  
#include <arpa/inet.h>  
#include <sys/ioctl.h>  
#include <sys/types.h>  
#include <sys/socket.h>  
  
#define MAC_SIZE    18  
#define IP_SIZE     16  
  
// function declare  
int get_ip_by_domain(const char *domain, char *ip);		// 根据域名获取ip  
int get_local_mac(const char *eth_inf, char *mac);		// 获取本机mac  
int get_local_ip(const char *eth_inf, char *ip);		// 获取本机ip  
  
  
/****** main test **********/  
int main(void)  
{  
    char ip[IP_SIZE];  
    char mac[MAC_SIZE];  
    const char *test_domain = "www.baidu.com";  
    const char *test_eth = "eth0";  
  
    get_ip_by_domain(test_domain, ip);  
    printf("%s ip: %s\n", test_domain, ip);  
  
    get_local_mac(test_eth, mac);  
    printf("local %s mac: %s\n", test_eth, mac);  
  
    get_local_ip(test_eth, ip);  
    printf("local %s ip: %s\n", test_eth, ip);  
  
    return 0;  
}  
  
// 根据域名获取ip  
int get_ip_by_domain(const char *domain, char *ip)  
{  
    char **pptr;  
    struct hostent *hptr;  
  
    hptr = gethostbyname(domain);  
    if(NULL == hptr) {  
        printf("gethostbyname error for host:%s/n", domain);  
        return -1;  
    }  
  
    for(pptr = hptr->h_addr_list ; *pptr != NULL; pptr++) {  
        if (NULL != inet_ntop(hptr->h_addrtype, *pptr, ip, IP_SIZE) ) {  
            return 0; // 只获取第一个 ip  
        }  
    }  
  
    return -1;  
}  
  
// 获取本机mac  
int get_local_mac(const char *eth_inf, char *mac)  
{  
    struct ifreq ifr;  
    int sd;  
      
    bzero(&ifr, sizeof(struct ifreq));  
    if( (sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {  
        printf("get %s mac address socket creat error\n", eth_inf);  
        return -1;  
    }  
      
    strncpy(ifr.ifr_name, eth_inf, sizeof(ifr.ifr_name) - 1);  
  
    if(ioctl(sd, SIOCGIFHWADDR, &ifr) < 0) {  
        printf("get %s mac address error\n", eth_inf);  
        close(sd);  
        return -1;  
    }  
  
    snprintf(mac, MAC_SIZE, "%02x:%02x:%02x:%02x:%02x:%02x",  
        (unsigned char)ifr.ifr_hwaddr.sa_data[0],   
        (unsigned char)ifr.ifr_hwaddr.sa_data[1],  
        (unsigned char)ifr.ifr_hwaddr.sa_data[2],   
        (unsigned char)ifr.ifr_hwaddr.sa_data[3],  
        (unsigned char)ifr.ifr_hwaddr.sa_data[4],  
        (unsigned char)ifr.ifr_hwaddr.sa_data[5]);  
  
    close(sd);  
      
    return 0;  
}  
  
  
// 获取本机ip  
int get_local_ip(const char *eth_inf, char *ip)  
{  
    int sd;  
    struct sockaddr_in sin;  
    struct ifreq ifr;  
  
    sd = socket(AF_INET, SOCK_DGRAM, 0);  
    if (-1 == sd) {  
        printf("socket error: %s\n", strerror(errno));  
        return -1;        
    }  
  
    strncpy(ifr.ifr_name, eth_inf, IFNAMSIZ);  
    ifr.ifr_name[IFNAMSIZ - 1] = 0;  
      
    // if error: No such device  
    if (ioctl(sd, SIOCGIFADDR, &ifr) < 0) {  
        printf("ioctl error: %s\n", strerror(errno));  
        close(sd);  
        return -1;  
    }  
  
    memcpy(&sin, &ifr.ifr_addr, sizeof(sin));  
    snprintf(ip, IP_SIZE, "%s", inet_ntoa(sin.sin_addr));  
  
    close(sd);  
    return 0;  
}


getdomainname()与gethostname()函数

原型如下:

#include <unistd.h> 

int gethostname(char *name, size_t len);   返回本地主机的标准主机名。

参数说明

接收缓冲区name,其长度必须为len字节或是更长

接收缓冲区name的最大长度

返回值:如果函数成功,则返回0。如果发生错误则返回-1。错误号存放在外部变量errno中。

原型如下:

#include <unistd.h> 

int getdomainname(char *name,size_t len); 可以允许程序获得程序正运行的主机的NIS域名。

参数说明:

这个函数的用法也gethostname相同。

例:

#include <unistd.h> 
#include <stdio.h>
#include <errno.h>
#include <string.h>

int main()
{
	char hostname[250];
	char dohostname[250];
	int rt;
	
	rt =gethostname(hostname,sizeof(hostname));
	
	if(rt == -1) {
		perror("gethostname fail");
		return -1;	
	}
	printf("hostname:%s\n",hostname);
	
	rt =getdomainname(dohostname,sizeof(dohostname));
	if (rt == -1) {
		perror("getdomainname fail");
		return -1;
	}
	printf("dohostname:%s\n",dohostname);
}











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值