Several methods to obtain local IP

1,python:

     python -c 'import socket;s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM);s.connect(("www.baidu.com",0));print s.getsockname()[0]'

2, dig command:

     dig +noall +answer www.baidu.com | head -n 1 | cut -d $'\t' -f 5 | xargs ip route get | head -n 1 | awk -F ' ' '{print $NF}'

3,ioctl函数(需要和网卡绑定):

 使用方法:std::string g_ip;

          get_local_host("eth0",g_ip);

int get_local_host(const std::string &card,std::string& localip) 
{
    int retval = -1;

    int sock = -1;
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == -1) {
        return retval;
    }

    struct ifreq ifr_ip;
    memset(&ifr_ip, 0, sizeof(ifr_ip));
    strncpy(ifr_ip.ifr_name, card.c_str(), sizeof(ifr_ip.ifr_name) - 1);

    retval = ioctl(sock, SIOCGIFADDR, &ifr_ip);
    if (retval < 0) {
        close(sock);
        return retval;
    }

    char ip_addr[64] = {0};
    struct sockaddr_in *sin;
    sin = (struct sockaddr_in *)&ifr_ip.ifr_addr;
    strcpy(ip_addr, inet_ntoa(sin->sin_addr));
    localip = std::string(ip_addr);
    close(sock);

    return retval;
}

4,gethostbyname & getsockname函数

void get_local_ip (std::string & ip_addr)
{
    struct hostent *hptr = gethostbyname("www.baidu.com");
    if (hptr == NULL) {
        printf("gethostbyname error for host: www.baidu.com : %s\n", hstrerror(h_errno));
        return ;
    }

    char str[INET_ADDRSTRLEN] = {0};
    switch (hptr->h_addrtype)
    {
    case AF_INET:
        inet_ntop(hptr->h_addrtype, hptr->h_addr, str, sizeof(str));
        break;
    default:
        printf("unknown address type\n");
        break;
    }

    int fd = socket (AF_INET, SOCK_DGRAM, 0); 
    socklen_t len = sizeof (struct sockaddr);
    struct sockaddr_in saddr;
    struct sockaddr_in name;

    /* Fake server.  */
    memset (&saddr, 0, sizeof (struct sockaddr));
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons (1234);
    inet_aton (str, &saddr.sin_addr);

    int ret = connect (fd, (struct sockaddr *)&saddr, len);
    if (ret == -1) {
        printf ("Connect fail.\n");
        goto out;
    }   
 
    ret = getsockname (fd, (struct sockaddr *)&name, &len);
    if (ret == -1) {
        printf ("Get socket name fail.\n");
        goto out;
    }  

    ip_addr = inet_ntoa(name.sin_addr);
    printf ("Local IP : %s\n", ip_addr.c_str());
out:
    close (fd);
 
    return ;
}

Guess you like

Origin blog.csdn.net/zgb40302/article/details/108007455