• unix网络编程中的地址转换函数


    1.地址转换函数有哪些?

    #include <arpa/inet.h>
    int
    inet_aton(const char *strptr,struct in_addr *addrptr);//返回:若字符串有效则为1,否则为0 in_addr_t inet_addr(const char *strptr);//返回:若字符串有效则为32位二进制网络字节序的IPV4地址,否则为INADDR_NONE char *inet_ntoa(struct in_addr inaddr);//返回:指向一个点分十进制串的指针
    int inet_pton(int family,const char *strptr,void *addrptr);//返回:若成功则为1,若输入无效则为0,出错则为-1
    const char*inet_ntop(int family,const void *addrptr,char *strptr,size_t len);//返回:若成功则为指向结果的指针。
    //若出错则为NULL

    inet_aton()函数将strptr所指的点分十进制地址串转换成一个32位的网络字节序二进制值并通过addrptr来存储。strptr可以指定为4种形式的字符串:“a.b.c.d”,“a.b.c”,"b,c","a",这四种形式的字符串的最后一个字段都必须能表明右边的2进制地址,例如,如果是"b,c"这种形式的,则b应该要是一个24-bit的值。

    inet_addr()函数将strptr转换成32位的网络字节序二进制值并返回。但此函数的strptr无效时返回-1(返回类型为无符号的),所以-1是一个有效地址(255.255.255.255),因此此函数存在一定的问题。

    inet_ntoa()函数将网络字节序二进制值转换为点分十进制串。但是由于它把返回的串存储在静态内存中(即静态区),一旦重复调用此函数,之前返回的串指针指向的值也会改变,即静态区的存储值改变了,因此它是一个不可重入的函数。

    inet_pton(),inet_ntop()函数都需要指定协议族(AF_INET,AF_INET6),因此这两个函数同时支持IPv4,IPv6协议族。如果以不支持的协议族作为参数这两个函数就返回一个错误并将errno设置为EAFNOSUPPORT。inet_pton()将strptr指针所指的字符串转换,并通过addrptr存放结果。inet_ntop则进行相反的转换,len参数是目标存储单元的大小,为了助于指定len的大小,<netinet/in.h>中有两个宏定义:

    #define INET_ADDRSTRLEN 16
    #define INET6_ADDRSTRLEN 46

    如果len太小,就返回一个空指针,并将errno设置为ENOSPC,inet_ntop函数的strptr参数不可以是一个空指针,调用者必须为目标存储单元分配内存并指定其大小。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));

    为了让调用者不必知道该结构的地址族我们可以重写一个自己的获取点分十进制地址的函数,实际上就是利用sockaddr中的协议族,对其进行判断即可。

    2.有关网络字节序的补充

    我们知道内存中存储字节有两种方式,一种是小端字节序,即将低序字节存储在起始地址,大端字节序则将高序字节存储在起始地址。

    而网络协议中的网络字节序使用的是大端字节序,因此发送协议栈和接收协议栈必须就这些多字节的数据中的各个字节传送顺序达成一致。但POSIX规范的规定,套接字地址结构中额某些字段必须按照网络字节序进行维护(s_addr,sin_port),因此我们需要将主机字节序向网络字节序进行转换。转换函数包括以下4个:

    #include <netinet/in.h>
    uint16_t htons (uint16_t __hostshort);
    uint32_t htonl (uint32_t __hostlong);//上面二者返回:网络字节序的值
    uint16_t ntohs (uint16_t __netshort);
    uint32_t ntohl (uint32_t __netlong);//下面二者返回:主机字节序的值
  • 相关阅读:
    关于Java集合框架,这篇讲的还算不错了,建议大家看看!
    其实SQL优化调优,就跟吃饭喝水一样简单,教你抓住SQL的本质!
    深度分析ReentrantLock源码及AQS源码,从入门到入坟,建议先收藏!
    建议收藏,从零开始创建一个Activiti工作流,手把手教你完成
    这个厉害了,ssm框架整合全过程,建议收藏起来好好看看
    阿里技术专家深入讲解,SpringMVC入门到进阶,看这一篇就够了
    python3.6:AttributeError: 'generator' object has no attribute 'next'
    【转】modulenotfounderror: no module named 'matplotlib._path'问题的解决
    sublime中使用插件anaconda而在代码中出现方框
    Linux上用sublime编辑Python时候出现"SyntaxError: Non-ASCII character ‘xe5′ in file"的问题
  • 原文地址:https://www.cnblogs.com/zhuiyicc/p/11800998.html
Copyright © 2020-2023  润新知