Linuxは本機のすべてのネットポートのipアドレスを取り外します


<!-- lang: cpp -->
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
#include <arpa/inet.h>

/* Sample:         ip   */
int main(int argc, char** argv)
{
    int ret = 0;
    int fd = -1;

    fd = socket(AF_INET, SOCK_DGRAM, 0);
    if ( fd < 0 ) {
        printf("%s@%d: error, errno = %d
", __FILE__, __LINE__, errno); ret = -1; goto out; } // , 32 , 32 ; ioctl 。 struct ifconf ifc; struct ifreq buf[32]; memset(buf, 0, sizeof(buf)); ifc.ifc_len = sizeof(buf); ifc.ifc_buf = (caddr_t)buf; ret = ioctl(fd, SIOCGIFCONF, (char*)&ifc); if ( ret < 0 ) { printf("%s@%d: error, errno = %d
", __FILE__, __LINE__, errno); goto out; } int ifcnt = ifc.ifc_len / sizeof(struct ifreq); while ( ifcnt-- > 0 ) { ret = ioctl(fd, SIOCGIFADDR, (char*)&buf[ifcnt]); if ( ret < 0 ) { printf("%s@%d: error, errno = %d
", __FILE__, __LINE__, errno); goto out; } printf("%s: %s
", buf[ifcnt].ifr_name, inet_ntoa(((struct sockaddr_in*)(&buf[ifcnt].ifr_addr))->sin_addr)); } out: if ( fd >= 0 ) close(fd); return ret; }