查同网段IP地址

#include <stdio.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/in.h>
#include <net/if_arp.h>
#include <arpa/inet.h>
#include <unistd.h>
 

typedef int s32;
typedef char s8;
#define IP_ADDR 16

static void NPLUS1_GetSlaveIP(s8 *slave_addr, s8* master_addr){
    #define MAXINTERFACES 16
    int fd, interface;
    struct ifreq buf[MAXINTERFACES];
    struct arpreq arp;
    struct ifconf ifc;
    char mac[32] = "";
    in_addr_t master = 0;
    struct sockaddr_in cmp_addr;
    inet_aton(master_addr, (struct in_addr*)&cmp_addr);
    master = ((struct in_addr*)&cmp_addr)->s_addr;
    if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) {        
        ifc.ifc_len = sizeof buf;
        ifc.ifc_buf = (caddr_t) buf;
        if (!ioctl(fd, SIOCGIFCONF, (char *) &ifc)) {
           interface = ifc.ifc_len / sizeof(struct ifreq);
            while (interface-- > 0) {
                if (!(ioctl(fd, SIOCGIFFLAGS, (char *) &buf[interface]))) {                    
                    if ((buf[interface].ifr_flags & IFF_LOOPBACK) == 0 &&
                    (buf[interface].ifr_flags & IFF_UP) &&
                    (buf[interface].ifr_flags & IFF_RUNNING) == 0) {
                        continue;
                    }
                }
                in_addr_t ip_addr = 0, net_mask = 0; 
                
                if (!(ioctl(fd, SIOCGIFNETMASK, (char *) &buf[interface]))) {
                    net_mask = ((struct sockaddr_in*) (&buf[interface].ifr_addr))->sin_addr.s_addr;
               } else {
                    char str[256] = "";
                    sprintf(str, "cpm: ioctl device %s",buf[interface].ifr_name);
                    perror(str);
                }
                /*Get IP of the net card */                
                if (!(ioctl(fd, SIOCGIFADDR, (char *) &buf[interface]))) {
                    ip_addr = ((struct sockaddr_in*) (&buf[interface].ifr_addr))->sin_addr.s_addr;
                    if((ip_addr&net_mask)==(master&net_mask))
                    {
                        strncpy(slave_addr, inet_ntoa(((struct sockaddr_in*) (&buf[interface].ifr_addr))->sin_addr), IP_ADDR);
                        break;
                    }
                } else {
                    char str[256] = "";
                    sprintf(str, "cpm: ioctl device %s",buf[interface].ifr_name);
                    perror(str);
                }
 
            } //end of while
        } else
            perror("cpm: ioctl");
    } else
        perror("cpm: socket");
    close(fd);
    return;
}

int main(int argc, char **argv){
    s8 slave_addr[255];
    memset(slave_addr, 0, 255);
    NPLUS1_GetSlaveIP(slave_addr, "10.78.115.121");
    printf("%s\n",slave_addr);
}

 

posted on 2017-08-24 16:19  job3721  阅读(529)  评论(0编辑  收藏  举报