我们所熟悉的ip地址形式是字符串形式的,如192.168.1.1。而网络编程中用的则是网络字节序的二进制。网络编程需要为套接字的各个字段赋值,复杂一点的就是成员struct in_addr sin_addr(针对ipv4的),首先这个成员是一个结构体,struct in_addr {in_addr_t s_addr};结构体里面定义了整形变量(通常是无符号的32位整数,从左到右每个字节对应着一段字符串,其实就是分别把192、168、1和1这三个字符串转换为无符号整数然后按序凑成一个32位的整数)。
系统调用位我们提供了接口根据192.168.1.1可以直接为结构体sin_addr赋值,就是接口
inet_aton(const char *ip,struct in_addr * netip),
其中参数ip就是我们的字符串ip,如192.168.1.1,const 表明进行转换时接口不会把我们的ip给修改了,这也给了一个启示:我们自己在写接口时输入参数最好也限制为const,这样可以避免调用完接口却把输入参数给修改了导致在后来的代码中使用这个输入参数值时出错。netip就是指向我们套接字的成员sin_addr的指针,已经改为网络字节序的了。
函数的返回值:如果输入参数ip有效则返回1,否则返回0。值得注意的是如果netip为NULL,则还会进行ip的有效性检查,只是不存储任何转换后的结果,因此此函数还可以用来验证某个ip地址是否为合法的ip地址,这在网络编程中也是常常会遇到的。
编程中还会遇到根据解析对端套接字获取对端字符串形式的ip,就可以用接口
char *inet_ntoa(struct in_addr inaddr)
这个函数与上面那个相比是反过来了,而且返回值时一个指针,所有的接口只要其返回值是指针,而且这个指针还有用,那么这个指针一定是接口内部在堆上分配内存时返回的指针。因此,对这种接口的使用就是char *ip=inet_ntoa();
上面两个函数只能用于ipv4的,不能用于ipv6协议,于是就有了通吃的接口
int inet_pton(int family,const char *ip,void *addr),成功返回1,输入的ip字符串不符合family的要求时就会返回0,出错返回-1.
addr是void类型的指针,因此这个接口才可以通吃。
char * inet_ntop(int family,const void* addr,char *ip,size_t iplen);//成功返回指向指针ip值,否则返回NULL。
注意这个接口与inet_ntoa()不同,这个接口ip指针不能为空,用户必须自己为ip分配内存空间,而inet_ntoa是自己分配内存空间。
阅读(831) | 评论(0) | 转发(0) |