How to get IP address from sockaddr

前端 未结 6 1581
慢半拍i
慢半拍i 2020-12-28 14:25

I want to try and get the ip address of a client after calling accept. This is what I have so far, but I just end up getting some long number that is clearly not an ip addr

6条回答
  •  滥情空心
    2020-12-28 15:29

    Seen from http://beej.us/guide/bgnet/examples/client.c:

    // get sockaddr, IPv4 or IPv6:
    void *get_in_addr(struct sockaddr *sa)
    {
        if (sa->sa_family == AF_INET)
            return &(((struct sockaddr_in*)sa)->sin_addr);
        return &(((struct sockaddr_in6*)sa)->sin6_addr);
    }
    
    // [...]
    
    struct addrinfo *p;
    char s[INET6_ADDRSTRLEN];
    inet_ntop(p->ai_family, get_in_addr((struct sockaddr *)p->ai_addr), s, sizeof s);
    

    It uses inet_ntop, which is preferred over inet_ntoa (non thread-safe) as it handles IPv4 and IPv6 (AF_INET and AF_INET6) and should be thread-safe I think.

提交回复
热议问题