查同网段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); }