|
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参数是目标存储单元的大小,以免该函数溢出其调用者的缓冲区。
在<netinet/in.h>头文件中定义如下
#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);
}
}
}
|
|
|