inet_ntop的一个基本问题是:它要求调用者传递一个指向某个二进制地址的指针,
而该地址通常包含在一个套接字地址结构中,这就要求调用者必须知道这个结构的格式和地址簇,
为了使用这个函数,我们必须为IPv4编写如下代码:
struct sockaddr_in addr;
inet_ntop(AF_INET,&addr.sin_addr,str,sizeof(str));
或为IPv6编写:
struct sockaddr_in6 addr6;
inet _ntop(AF_INET6,&addr6.sin6_addr,str,sizeof(str));
这就使得代码和协议相关了。
为了解决这个问题,我们将自己编写一个名为sock_ntop的函数,
它以指向某个套接字地址结构的指针为参数,查看该结构的内部,然后调用适当的函数返回该地址的表达式
char * sock_ntop(const struct sockaddr * sockaddr,socklen_t addrlen);
sockaddr指向一个长度为addrlen的套接字地址结构,本函数用它自己的静态缓冲区来保存结果,而指向该缓冲区的一个指针就是它的返回值
我们还可以定义其他几个函数,简化IPv4与IPv6之间的移植
sock_bind_wild将通配地址和一个临时端口捆绑到一个套接字
sock_cmp_addr比较2个套接字地址结构的地址部分
sock_cmp_port比较2个套接字地址结构的端口部分
sock_get_port只返回端口号
scok_ntop_host把一个套接字地址结构中的主机部分转换成表达格式(不包括端口号)
....