- 1、本文档共67页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
7.2.2 地址及顺序处理 数据存储优先顺序 (1)函数说明 计算机数据存储有两种字节优先顺序:高位字节优先和低位字节优先. Internet上数据以高位字节优先顺序在网络上传输,因此在有些情况下,需要对这两个字节存储优先顺序进行相互转化。这里用到了四个函数:htons()、ntohs()、htonl()和ntohl()。 这四个地址分别实现网络字节序和主机字节序的转化,这里的h代表host,n代表network,s代表short,l代表long。通常16位的IP端口号用s代表,而IP地址用l来代表。 调用这些函数只是使其得到相应的字节序,用户不需清楚该系统的主机字节序和网络字节序是否真正相等。如果是相同不需要转换的话,该系统的这些函数会定义成空宏。 7.2.2 地址及顺序处理 数据存储优先顺序 (2)函数格式说明 这四个函数的语法格式如下所示。 ? 头文件 #include netinet/in.h ? 函数原型 uint16_t htons(unit16_t host16bit) /*主机字节序的16bit数据*/ uint32_t htonl(unit32_t host32bit) /*网络字节序的32bit数据*/ uint16_t ntohs(unit16_t net16bit) /*网络字节序的16bit数据*/ uint32_t ntohs(unit32_t net32bit) /*网络字节序的32bit数据*/ ? 函数返回值: 成功:返回字节序转换后的数据 出错:-1 7.2.2 地址及顺序处理 地址格式转化 (1)函数说明 用户在表达地址时通常采用点分十进制表示的数值(或者是以冒号分开的十进制IPv6地址),而在通常使用的socket编程中所使用的则是二进制值,这就需要将这两个数值进行转换。 这里在IPv4中用到的函数有inet_aton()、inet_addr()和inet_ntoa(),而IPv4和IPv6兼容的函数有inet_pton()和inet_ntop()。由于IPv6是下一代互联网的标准协议,因此,本书讲解的函数都能够同时兼容IPv4和IPv6,但在具体举例时仍以IPv4为例。 inet_pton()函数是将点分十进制地址映射为二进制地址,而inet_ntop()是将二进制地址映射为点分十进制地址。 7.2.2 地址及顺序处理 地址格式转化 (2)函数格式 inet_pton和inet_ntop函数的语法要点如下所示。 ? 头文件 #include arpa/inet.h ? 函数原型 int inet_pton( int family, /*协议类型*/ const char *strptr, /*要转化的值*/ void *addrptr) /*转化后的地址*/ int inet_ntop( int family, /*协议族,AF_INET */ void *addrptr, /*转化后的地址*/ char *strptr, /*要转化的值*/ size_t len) /*转化后值的大小*/ ? 函数返回值 成功:0 出错:-1 7.2.2 地址及顺序处理 名字地址转化 (1)函数说明 在Linux中有一些函数可以实现主机名和地址的转化,如gethostbyname、gethostbyaddr、getaddrinfo等,它们都可以实现IPv4和IPv6的地址和主机名之间的转化。 其中gethostbyname是将主机名转化为IP地址,gethostbyaddr则是逆操作,是将IP地址转化为主机名,另外getaddrinfo还能实现自动识别IPv4地址和IPv6地址。 7.2.2 地址及顺序处理 名字地址转化 (1)函数说明 gethostbyname和gethostbyaddr都涉及一个hostent的结构体,如下所示: struct hostent{ char *h_name;/*正式主机名*/ char **h_aliases;/*主机别名*/ int h_addrtype;/*地址类型*/ int h_length;/*地址长度*/ char **h_addr_list;/*指向IPv4或IPv6的地址指针数组*/ } 调用该函数后就能返回hostent结构体的相关信息。 7.2.2 地址及顺序处理 名字地址转化 (1)函数说明 getaddrinfo函数涉及一个addri
文档评论(0)