casting sockaddr_storage as sockaddr_in for inet_ntop

前端 未结 2 1089
孤街浪徒
孤街浪徒 2020-12-18 12:14

I am trying to cast a sockaddr_storage to a sockadd_in, so that i can print out the source ip address of a datagram packet, i do not seem to be able to get the cast correct,

2条回答
  •  囚心锁ツ
    2020-12-18 12:50

    inet_ntop(peer_addr->ss_family, &(((struct sockaddr_in *)peer_addr)->sin_addr), ipbuff, INET_ADDRSTRLEN);
    

    should work. But consider to use getnameinfo() instead, which is the more modern interface:

    char host[NI_MAXHOST];
    getnameinfo((struct sockaddr *)peer_addr, peer_addr->ss_len, host, sizeof(host), NULL, 0, NI_NUMERICHOST);
    

    works for both IPv4 and IPv6 addresses.


    Update according to the changed types in the question: This is a complete example that should compile without warnings:

    int socket = ...;
    
    struct sockaddr_storage peer_addr;
    socklen_t peer_addrlen;
    char host[NI_MAXHOST];
    
    ssize_t amount;
    char buffer[1000];
    amount = recvfrom(socket, buffer, sizeof(buffer), 0, (struct sockaddr *)&peer_addr, &peer_addrlen);
    getnameinfo((struct sockaddr *)&peer_addr, peer_addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST);
    

    Or, using inet_ntop():

    char ipbuff[INET_ADDRSTRLEN];
    inet_ntop(peer_addr.ss_family, &(((struct sockaddr_in *)&peer_addr)->sin_addr), ipbuff, INET_ADDRSTRLEN);
    

提交回复
热议问题