zoukankan      html  css  js  c++  java
  • 获取本机ip地址


    /*
     *  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);
    }
  • 相关阅读:
    28完全背包+扩展欧几里得(包子凑数)
    HDU 3527 SPY
    POJ 3615 Cow Hurdles
    POJ 3620 Avoid The Lakes
    POJ 3036 Honeycomb Walk
    HDU 2352 Verdis Quo
    HDU 2368 Alfredo's Pizza Restaurant
    HDU 2700 Parity
    HDU 3763 CDs
    POJ 3279 Fliptile
  • 原文地址:https://www.cnblogs.com/hxwj/p/4864731.html
Copyright © 2011-2022 走看看