获取本机ip地址
发布日期:2021-09-08 22:54:42 浏览次数:18 分类:技术文章

本文共 4268 字,大约阅读时间需要 14 分钟。

/*
 *  IPAdress.h
 *
 *
 
*/
#define MAXADDRS    32
extern 
char *if_names[MAXADDRS];
extern 
char *ip_names[MAXADDRS];
extern 
char *hw_addrs[MAXADDRS];
extern unsigned 
long ip_addrs[MAXADDRS];
//
 Function prototypes
void InitAddresses();
void FreeAddresses();
void GetIPAddresses();
void GetHWAddresses();
/*
 *  IPAddress.c
 *
 
*/
//
#include "IPAddress.h"
#include <stdio.h>
#include <stdlib.h>
#include <
string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/
in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/sockio.h>
#include <net/
if.h>
#include <errno.h>
#include <net/if_dl.h>
#include <net/ethernet.h>
//
add include 
//
#include "IPAddress.h"
#define    min(a,b)    ((a) < (b) ? (a) : (b))
#define    max(a,b)    ((a) > (b) ? (a) : (b))
#define BUFFERSIZE    4000
char *if_names[MAXADDRS];
char *ip_names[MAXADDRS];
char *hw_addrs[MAXADDRS];
unsigned 
long ip_addrs[MAXADDRS];
static 
int   nextAddr = 
0;
void InitAddresses()
{
    
int i;
    
for (i=
0; i<MAXADDRS; ++i)
    {
        if_names[i] = ip_names[i] = hw_addrs[i] = NULL;
        ip_addrs[i] = 
0;
    }
}
void FreeAddresses()
{
    
int i;
    
for (i=
0; i<MAXADDRS; ++i)
    {
        
if (if_names[i] != 
0) free(if_names[i]);
        
if (ip_names[i] != 
0) free(ip_names[i]);
        
if (hw_addrs[i] != 
0) free(hw_addrs[i]);
        ip_addrs[i] = 
0;
    }
    InitAddresses();
}
void GetIPAddresses()
{
    
int                 i, len, flags;
    
char                buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr;
    
struct ifconf       ifc;
    
struct ifreq        *ifr, ifrcopy;
    
struct sockaddr_in    *sin;
    
    
char temp[
80];
    
    
int sockfd;
    
    
for (i=
0; i<MAXADDRS; ++i)
    {
        if_names[i] = ip_names[i] = NULL;
        ip_addrs[i] = 
0;
    }
    
    sockfd = socket(AF_INET, SOCK_DGRAM, 
0);
    
if (sockfd < 
0)
    {
        perror(
"
socket failed
");
        
return;
    }
    
    ifc.ifc_len = BUFFERSIZE;
    ifc.ifc_buf = buffer;
    
    
if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 
0)
    {
        perror(
"
ioctl error
");
        
return;
    }
    
    lastname[
0] = 
0;
    
    
for (ptr = buffer; ptr < buffer + ifc.ifc_len; )
    {
        ifr = (
struct ifreq *)ptr;
        len = max(
sizeof(
struct sockaddr), ifr->ifr_addr.sa_len);
        ptr += 
sizeof(ifr->ifr_name) + len;    
//
 for next one in buffer
        
        
if (ifr->ifr_addr.sa_family != AF_INET)
        {
            
continue;    
//
 ignore if not desired address family
        }
        
        
if ((cptr = (
char *)strchr(ifr->ifr_name, 
'
:
')) != NULL)
        {
            *cptr = 
0;        
//
 replace colon will null
        }
        
        
if (strncmp(lastname, ifr->ifr_name, IFNAMSIZ) == 
0)
        {
            
continue;    
/*
 already processed this interface 
*/
        }
        
        memcpy(lastname, ifr->ifr_name, IFNAMSIZ);
        
        ifrcopy = *ifr;
        ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy);
        flags = ifrcopy.ifr_flags;
        
if ((flags & IFF_UP) == 
0)
        {
            
continue;    
//
 ignore if interface not up
        }
        
        if_names[nextAddr] = (
char *)malloc(strlen(ifr->ifr_name)+
1);
        
if (if_names[nextAddr] == NULL)
        {
            
return;
        }
        strcpy(if_names[nextAddr], ifr->ifr_name);
        
        sin = (
struct sockaddr_in *)&ifr->ifr_addr;
        strcpy(temp, inet_ntoa(sin->sin_addr));
        
        ip_names[nextAddr] = (
char *)malloc(strlen(temp)+
1);
        
if (ip_names[nextAddr] == NULL)
        {
            
return;
        }
        strcpy(ip_names[nextAddr], temp);
        
        ip_addrs[nextAddr] = sin->sin_addr.s_addr;
        
        ++nextAddr;
    }
    
    close(sockfd);
}
void GetHWAddresses()
{
    
struct ifconf ifc;
    
struct ifreq *ifr;
    
int i, sockfd;
    
char buffer[BUFFERSIZE], *cp, *cplim;
    
char temp[
80];
    
    
for (i=
0; i<MAXADDRS; ++i)
    {
        hw_addrs[i] = NULL;
    }
    
    sockfd = socket(AF_INET, SOCK_DGRAM, 
0);
    
if (sockfd < 
0)
    {
        perror(
"
socket failed
");
        
return;
    }
    
    ifc.ifc_len = BUFFERSIZE;
    ifc.ifc_buf = buffer;
    
    
if (ioctl(sockfd, SIOCGIFCONF, (
char *)&ifc) < 
0)
    {
        perror(
"
ioctl error
");
        close(sockfd);
        
return;
    }
    
    ifr = ifc.ifc_req;
    
    cplim = buffer + ifc.ifc_len;
    
    
for (cp=buffer; cp < cplim; )
    {
        ifr = (
struct ifreq *)cp;
        
if (ifr->ifr_addr.sa_family == AF_LINK)
        {
            
struct sockaddr_dl *sdl = (
struct sockaddr_dl *)&ifr->ifr_addr;
            
int a,b,c,d,e,f;
            
int i;
            
            
//
strcpy(temp, (char *)ether_ntoa(LLADDR(sdl)));
//
modify
            strcpy(temp, (
char *)ether_ntoa((
struct ether_addr*)LLADDR(sdl)));
            sscanf(temp, 
"
%x:%x:%x:%x:%x:%x
", &a, &b, &c, &d, &e, &f);
            sprintf(temp, 
"
%02X:%02X:%02X:%02X:%02X:%02X
",a,b,c,d,e,f);
            
            
for (i=
0; i<MAXADDRS; ++i)
            {
                
if ((if_names[i] != NULL) && (strcmp(ifr->ifr_name, if_names[i]) == 
0))
                {
                    
if (hw_addrs[i] == NULL)
                    {
                        hw_addrs[i] = (
char *)malloc(strlen(temp)+
1);
                        strcpy(hw_addrs[i], temp);
                        
break;
                    }
                }
            }
        }
        cp += 
sizeof(ifr->ifr_name) + max(
sizeof(ifr->ifr_addr), ifr->ifr_addr.sa_len);
    }
    
    close(sockfd);
}

转载于:https://www.cnblogs.com/hxwj/p/4864731.html

转载地址:https://blog.csdn.net/weixin_34341229/article/details/93340047 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:数据库导出导入操作(expdp,impdp)
下一篇:unittest培训后总结记录

发表评论

最新留言

很好
[***.229.124.182]2024年04月09日 13时15分58秒