网络编程之inet_pton,inet_ntop,sock_ntop函数

inet_pton

        inet_pton函数转换由strptr指针所指的字符串,并通过addrptr指针存放二进制结果。若成功则为1,若输入不是有效的表达式格式则为0,若出错则为-1;

int inet_pton(int family, const char* strptr, void* addrptr)

{
if (family == AF_INET)
{
struct in_addr in_val;
if (inet_aton(strptr, &in_val))//int inet_aton(const char*strptr,struct in_addr *addrptr)若字符串有效则为1,否则为0。
{
memcpy(addrptr, &in_val, sizeof(struct in_addr));
return (1);
}
return (0);
}
errno = EAFNOSUPPORT;//family可以是参数AF_INET,也可以是AF_INET6,如果以不被支持的地址族作为family参数,函数将返回一个错误,并将errno置为EAFNOSUPPORT。
return (-1);
}


inet_aton函数将strptr所值C字符串转换为一个32位的网络字节序二进制值,并通过指针addrptr来存储。


二inet_ntop

   inet_ntop从数值格式(addrptr)转换到表达式格式(strptr),len参数是目标存储单元的大小,以免该函数溢出其调用者的缓冲区。

头文件中定义如下

#define  INET_ADDRSTRLEN 16 //for ipv4 dotted_decimal

#define INET_ADDRSTRLEN 46 //for ipv6 hex string

    inet_ntop函数的strptr参数不可以是一个空指针,调用者必须为目标存储单元分配内存并指定其大小。调用成功时,这个指针就是该函数的返回值.

const char* inet_ntop(int family, const void* addrptr, char *strptr, size_t len)
{
const u_char *p = (const u_char*)addrptr;
if (family == AF_INET)
{
char temp[INET_ADDRSTRLEN];
snprintf(temp, sizeof(temp), "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
if (strlen(temp) >= len)//如果len太小,不足以容纳表达式格式结果,那么返回一个空指针,并置errno为                                                                                                                                                              ENOSPC。

                {
errno = ENOSPC;
return (NULL);
}
strcpy(strptr, temp);
return (strptr);
}
errno = EAFNOSUPPORT;
return (NULL);
}

三:sock_ntop

本函数用它的静态缓冲区来保存结果,而指向该缓冲区的一个指针就是它的返回值。

char* sock_ntop(const struct sockaddr* sa, socklen_t salen)
{
char portstr[8];
static char str[128];
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), ":%d", ntohs(sin->sin_port));
strcat(str, portstr);
}
return(str);
}

  }
}

你可能感兴趣的:(网络编程之inet_pton,inet_ntop,sock_ntop函数)