rihi 发表于 2015-11-24 00:29:25

sock_ntop()函数的实现

#include   &quot;unp.h&quot; #ifdef HAVE_SOCKADDR_DL_STRUCT#include   <net/if_dl.h>#endif /* include sock_ntop */char *sock_ntop(const struct sockaddr *sa, socklen_t salen){    char      portstr;    static char str;   /* Unix domain is largest */   switch (sa->sa_family) {    case AF_INET: {      struct sockaddr_in*sin = (struct sockaddr_in *) sa;         if (inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str)) == NULL)            return(NULL);      if (ntohs(sin->sin_port) != 0) {            snprintf(portstr, sizeof(portstr), &quot;:%d&quot;, ntohs(sin->sin_port));            strcat(str, portstr);      }      return(str);    }/* end sock_ntop */ #ifdef IPV6    case AF_INET6: {      struct sockaddr_in6   *sin6 = (struct sockaddr_in6 *) sa;         str = '[';      if (inet_ntop(AF_INET6, &sin6->sin6_addr, str &#43; 1, sizeof(str) - 1) == NULL)            return(NULL);      if (ntohs(sin6->sin6_port) != 0) {            snprintf(portstr, sizeof(portstr), &quot;]:%d&quot;, ntohs(sin6->sin6_port));            strcat(str, portstr);            return(str);      }      return (str &#43; 1);    }#endif #ifdef AF_UNIX    case AF_UNIX: {      struct sockaddr_un*unp = (struct sockaddr_un *) sa;             /* OK to have no pathname bound to the socket: happens on               every connect() unless client calls bind() first. */      if (unp->sun_path == 0)            strcpy(str, &quot;(no pathname bound)&quot;);      else            snprintf(str, sizeof(str), &quot;%s&quot;, unp->sun_path);      return(str);    }#endif #ifdef HAVE_SOCKADDR_DL_STRUCT    case AF_LINK: {      struct sockaddr_dl*sdl = (struct sockaddr_dl *) sa;         if (sdl->sdl_nlen > 0)            snprintf(str, sizeof(str), &quot;%*s (index %d)&quot;,                     sdl->sdl_nlen, &sdl->sdl_data, sdl->sdl_index);      else            snprintf(str, sizeof(str), &quot;AF_LINK, index=%d&quot;, sdl->sdl_index);      return(str);    }#endif    default:      snprintf(str, sizeof(str), &quot;sock_ntop: unknown AF_xxx: %d, len %d&quot;,               sa->sa_family, salen);      return(str);    }    return (NULL);} char *Sock_ntop(const struct sockaddr *sa, socklen_t salen){    char    *ptr;   if ( (ptr = sock_ntop(sa, salen)) == NULL)      err_sys(&quot;sock_ntop error&quot;);    /* inet_ntop() sets errno */    return(ptr);}
页: [1]
查看完整版本: sock_ntop()函数的实现