当前位置: 首页 > 面试题库 >

通过使用UDP套接字的connect()ing获得我自己的IP地址?

姬乐
2023-03-14
问题内容

我听说可以通过创建一个UDP socket并将我的()连接到有效的目标IP地址(例如Google)来获得自己的IP地址(不是127.0.0.1)。

但是,我找不到任何参考或示例。

这可能吗?如果是这样,我该怎么做?

char* get_my_ip() {
    int sockfd;
    struct sockaddr_storage remoteaddr; // client address
    socklen_t addrlen;
    char remoteIP[INET6_ADDRSTRLEN];
    char *ip_addr;
    ip_addr = malloc(sizeof(char) * INET6_ADDRSTRLEN);
    int rv;

    struct addrinfo hints, *ai, *p;

    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_DGRAM;
    if ((rv = getaddrinfo("8.8.8.8", "http", &hints, &ai)) != 0) {
        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
        exit(1);
    }
    // loop through all the results and make a socket
    for(p = ai; p != NULL; p = p->ai_next) {
        if ((sockfd = socket(p->ai_family, p->ai_socktype,
            p->ai_protocol)) == -1) {
            perror("UDP: socket");
            continue;
        }

        if (connect(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
            close(sockfd);
            perror("UDP: connect");
            continue;
        }
        break;
    }
    if (p == NULL) {
        fprintf(stderr, "UDP: failed to bind socket\n");
        exit(2);
    }

    getsockname(sockfd, (struct sockaddr*)&remoteaddr, &addrlen);

    // deal with both IPv4 and IPv6:
    if (remoteaddr.ss_family == AF_INET) {
        struct sockaddr_in *s = (struct sockaddr_in *)&remoteaddr;
        inet_ntop(AF_INET, &s->sin_addr, remoteIP, addrlen);
    }
    else { // AF_INET6
        struct sockaddr_in6 *s = (struct sockaddr_in6 *)&remoteaddr;
        inet_ntop(AF_INET6, &s->sin6_addr, remoteIP, addrlen);
    }
    printf("IP_ADDRESS:%s", remoteIP);

    freeaddrinfo(ai); // all done with this structure
    close(sockfd);

    strcpy(ip_addr, remoteIP);
    return ip_addr;
}

问题答案:

呼叫connect(),然后getsockname()在您的套接字上。它将返回套接字现在绑定到的IP地址,该地址已被IP路由表选择为到达目标地址的最佳路由。

但是,除非您只有一个外部IP地址,否则不一定是您要查找的IP地址。

如果您正在谈论调制解调器或路由器另一侧的 公用 IP地址,则此技术根本不适用。



 类似资料:
  • 问题内容: 我想获取启动程序的计算机的IP地址,然后将其发送到客户端,但是我总是得到0.0.0.1而不是真实的IP地址(例如127.0.0.1)。 我目前可以获取端口,但无法获取IP地址。 我怎么才能得到它? 最好的解决方案是能够使用。这是我目前正在做的事情: 编辑: 我知道我的思维方式走错了路。所以我的问题是:获得自己的IP地址的最佳方法是什么? 问题答案: 当您将套接字设为0.0.0.0时,这

  • 我有一个非常奇怪的问题。我找不到服务器接收数据的客户端的IP地址。下面是我的UDP侦听器类。 IPPacketInformation不包含IP。我在EndReceiveMessageFrom中引用的clientEndPoint两者都没有。 当我 我得到服务器的 IP 地址。我将服务器托管在自己的计算机上,因此我获得了自己的IP地址。当我尝试访问clientEndPoint.remoteEndPoi

  • 问题内容: 为了查看我在处理传入数据方面的表现如何,我想测量TCP和UDP套接字上的队列长度。 我知道我可以通过套接字选项获取队列大小,并且可以告诉我有关TCP套接字的信息。但是对于UDP,/ ioctl仅返回下一个未决数据报的大小。有没有一种方法可以获取UDP的队列大小,而无需解析系统表,例如? 问题答案: 如ldx所述,ioctl或getsockopt不支持它。在我看来,SIOCINQ的当前实

  • 此函数创建sockaddr_in6: 基本上,如果地址是IPv4地址,我会在它前面加上,并将该族设置为af_inet。 这有可能做到。如果是,我做错了什么?

  • 我已经在Minikube上部署了一个UDP套接字服务器。套接字服务绑定到端口2152。下面是description pod命令中的IP片段。 我的客户机与minikube运行在同一个VM上,无法与服务器通信。我在客户端使用服务器地址IP 172.17.0.3,端口为2152。我还尝试使用minikube IP 192.168.49.2将UDP数据从客户端发送到服务器。 请帮忙,这里有什么问题。

  • 我如何为我自己的用户获取Spotify访问令牌,而不是从Postman处获取? 我想使用邮递员从Spotify获取访问令牌(无需之前的手动登录)。 如果这很复杂,我会接受先手动登录,然后再从Postman获取令牌。 < li >要获得访问令牌(将在我自己的Postman请求中进一步使用),我必须在登录Spotify开发者网站时手动获得一个。 因此,我想直接从Postman获得它,在那里我可以立即在