Getting the source address of an incoming socket connection

后端 未结 3 2114
离开以前
离开以前 2020-12-15 19:01

I have a server with a incoming socket from a client. I need the get the IP address of the remote client. Tried searching google for in_addr but it\'s a bit tro

相关标签:
3条回答
  • 2020-12-15 19:20

    You need the getpeername function:

    // assume s is a connected socket
    
    socklen_t len;
    struct sockaddr_storage addr;
    char ipstr[INET6_ADDRSTRLEN];
    int port;
    
    len = sizeof addr;
    getpeername(s, (struct sockaddr*)&addr, &len);
    
    // deal with both IPv4 and IPv6:
    if (addr.ss_family == AF_INET) {
        struct sockaddr_in *s = (struct sockaddr_in *)&addr;
        port = ntohs(s->sin_port);
        inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
    } else { // AF_INET6
        struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
        port = ntohs(s->sin6_port);
        inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
    }
    
    printf("Peer IP address: %s\n", ipstr);
    
    0 讨论(0)
  • 2020-12-15 19:23

    Since you say it is an incoming connection from a client, as an alternative to getpeername you can just save the address that was returned by the accept() call, in the second and third parameters.

    0 讨论(0)
  • 2020-12-15 19:38

    Assuming you're using accept() to accept incoming socket connections, getpeername() isn't needed. The address information is available via the 2nd and 3rd parameters of the accept() call.

    Here is Eli's answer modified to do it without getpeername():

    int client_socket_fd;
    socklen_t len;
    struct sockaddr_storage addr;
    char ipstr[INET6_ADDRSTRLEN];
    int port;
    
    len = sizeof addr;
    client_socket_fd = accept(server_socket_fd, (struct sockaddr*)&addr, &len);
    
    // deal with both IPv4 and IPv6:
    if (addr.ss_family == AF_INET) {
        struct sockaddr_in *s = (struct sockaddr_in *)&addr;
        port = ntohs(s->sin_port);
        inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
    } else { // AF_INET6
        struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
        port = ntohs(s->sin6_port);
        inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
    }
    
    printf("Peer IP address: %s\n", ipstr);
    
    0 讨论(0)
提交回复
热议问题