繁体   English   中英

通过套接字创建/ getsockname查找本地IP

[英]Finding Local IP via Socket Creation / getsockname

我需要获取C ++中系统的IP地址。 我遵循此处的另一条评论的逻辑和建议,创建了一个套接字,然后利用getsockname确定该套接字绑定到的IP地址。

但是,这似乎不起作用(下面的代码)。 我应该收到128.etc时收到无效的IP地址(58.etc)

有任何想法吗?

   string Routes::systemIP(){

    // basic setup
    int sockfd;
    char str[INET_ADDRSTRLEN];
    sockaddr* sa;
    socklen_t* sl;
    struct addrinfo hints, *servinfo, *p;
    int rv;
    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_DGRAM;

    if ((rv = getaddrinfo("4.2.2.1", "80", &hints, &servinfo)) != 0) {
        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
        return "1";
    }

    // loop through all the results and make a socket
    for(p = servinfo; p != NULL; p = p->ai_next) {
        if ((sockfd = socket(p->ai_family, p->ai_socktype,
                p->ai_protocol)) == -1) {
            perror("talker: socket");
            continue;
        }

        break;
    }

    if (p == NULL) {
        fprintf(stderr, "talker: failed to bind socket\n");
        return "2";
    }

    // get information on the local IP from the socket we created
    getsockname(sockfd, sa, sl);

    // convert the sockaddr to a sockaddr_in via casting
    struct sockaddr_in *sa_ipv4 = (struct sockaddr_in *)sa;

    // get the IP from the sockaddr_in and print it
    inet_ntop(AF_INET, &(sa_ipv4->sin_addr.s_addr), str, INET_ADDRSTRLEN);
    printf("%s\n", str);

    // return the IP
    return str;
}

您的代码已经包含提示: failed to bind socket 但是您削减了尝试连接的代码部分(您是从Stevens UnP复制的吗?)。 该套接字未连接任何东西,因此网络堆栈尚未为其分配本地地址。

连接套接字后,内核必须根据路由表为其选择本地地址。 到那时, getsockname(2)将按预期工作。

您无需分配套接字即可获取机器的可用IP地址。 您可以改用套接字API gethostname()和gethostbyname()函数。 或者,在Windows上,您也可以使用Win32 API的GetAdaptersInfo()或GetAdaptersAddresses()函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM