网络字节序是大端编码,
编码方式有两种:
①小端编码:高位数字存放在高地址字节中,如0x1234,小端编码机器将12存放在高位地址字节,34存放在低地址字节中,将其转化为1字节的char时,高地址字节被丢弃,剩余低地址字节,就是34。
②大端编码:高位数字存放在低地址字节中,将0x1234转化为1字节的char,高地址字节被丢弃,剩余低地址字节,即12。
htons函数将一个short类型从本机字节序转换为网络字节序。

#include<arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);

从网络上收到数据后,如果需要将整数从网络字节序转化为本地字节序,则使用下列函数:

#include<arpa/inet.h>
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

这类转换函数的实现原理是:如果本地字节序为大端编码,则什么也不做,是小端编码,则进行相应转换。

Windows:

#include<winsock2.h>
htou_short htons(u_short hostshort);
u_long htonl(u_long hostlong);
unsigned _int64 htonll(unsigned _int64 Value);u_short ntohs(u_short netshort);
u_long ntohl(u_long netlong);
unsigned _int64 ntohll(unsigned _int64 Value);
#include<endian.h>uint16_t htobe16(uint16_t host_16bits);
uint16_t htole16(uint16_t host_16bits);
uint16_t be16toh(uint16_t big_endian_16bits);
uint16_t le16toh(uint16_t little_endian_16bits);uint32_t htobe32(uint32_t host_32bits);
uint32_t htole32(uint32_t host_32bits);
uint32_t be32toh(uint32_t big_endian_32bits);
uint32_t le32toh(uint32_t little_endian_32bits);uint64_t htobe64(uint16_t host_64bits);
uint64_t htole64(uint16_t host_64bits);
uint64_t be64toh(uint16_t big_endian_64bits);
uint64_t le64toh(uint16_t little_endian_64bits);

Windows上的htonll函数对应htobe64函数,ntohll函数对应be64toh。因此,我们在跨平台时可以这么写:

#ifdef WIN32
//在Windows上存在ntohll和htonll,直接使用
#else
//在linux上没有这两个函数,定义之
#define ntohll(x) be64toh(x)
#define htonll(x) htobe64(x)
#endif

字节操纵函数

操纵多字节字段的函数有两组,它们既不对数据作解释,也不假设数据是以空字符结束的C字符串。

源自Berkeley的函数。

#include<strings.h>
void bzero(void *dest,size_t nbytes);
void bcopy(const void* src,void *dest, size_t nbytes);
int bcmp(const void *ptrl,const void *ptr2, size_t nbytes);返回:若相等则为0,否则为非0

ANSI C函数:

#include<string.h>
void *memset(void *dest,int c, size_t len);
void *memcpy(void *dest,const void *src,size_t nbytes);
int memcmp(const void *ptrl,const void *ptr2, size_t nbytes);返回:若相等则为0,否则为<0或>0

memset把目标字节串指定数目的字节置为值c。memcpy类似bcopy,当源字节串与目标字节串重叠时,bcopy能够正确处理,但是memcpy的操作结果不可知。这种情况必须改用ANSI C的memmove函数。

memcmp比较两个任意的字节串,若相同则返回0,否则返回一个非0值,是大于0还是小于0 则取决于第一个不等的字节:如果所指字节串中的这个字节大于p"2所指字节中的对应字节,那么大于0,否则小于0。我们的比较操作是在假设两个不等的字节均为无符号字符 (unsigned char)的前提下完成的。

inet_aton、inet_addr和inet_ntoa函数

(1) inet_aton、 inet_addr和inet_ntoa在点分十进制数串(例如“206.168.112.96") 与它长度为32位的网络字节序二进制值间转换IPv4地址。
(2) 两个较新的函数inet_pton和inet_ntop对于IPv4地址和IPv6地址都适用。

#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);返回:指向一个点分十进制数串的指针

第一个函数inet_aton将strptr所指C字符串转换成一个32位的网络字节序二进制值,并通过addrptr来存储。
inet_addr已经被废弃。
inet_ntoa函数将一个32位的网络字节序二进制IPv4地址转换成相应的点分十进制数串。由该函数的返回值所指向的字符串驻留在静态内存中,这意味着该函数是不可重入的。

这两个函数是随IPV6出现的新函数,对于IPV4地址和IPV6地址都适用。

#include<arpa/inet.h>
int inet_pton(int family, const char *strptr,void *addrptr);返回:若成功则为1,若输入不是有效的表达格式为0,若出错则为-1const char* inet_ntop(int family, const void *addrptr, char *strptr, size_t len);返回:若成功则为指向结果的指针,若出错则为NULL

这两个函数的family参数既可以是AF_INET,也可以是AF——INET6.如果是不被支持的协议簇作为family参数,这两个函数就都返回一个错误,并将errno置为EAFNOSUPPORT。

第一个函数尝试转换由strptr指针所指的字符串,并通过addrptr指针存放二进制结果。
inet_ntop进行相反的转换,从数值格式转换到表达格式。len参数是目标存储单元的大小,以免该函数溢出其调用者的缓冲区。为有助于指定这个大小,在 <netinet/in. h>头文件中有如下定义:

#define INET_ADDRSTRLEN  16  /* for IPv4 dotted-decimal */
#define INET6_ADDRSTRLEN 46 /* for IPv6 hex string */

如果len太小,不足以容纳表达格式结果(包括结尾的空字符),那么返回一个空指针,并 置errno为ENOSPC。
inet_ntop函数的strptr参数不可以是一个空指针。调用者必须为目标存储单元分配内存并指定其大小。调用成功时,这个指针就是该函数的返回值。

网络字节序与地址转换函数相关推荐

  1. Linux 网络编程详解一(IP套接字结构体、网络字节序,地址转换函数)

    IPv4套接字地址结构 struct sockaddr_in {uint8_t sinlen;(4个字节)sa_family_t sin_family;(4个字节)in_port_t sin_port ...

  2. 【Linux网络编程】网络字节序和地址转换

    00. 目录 文章目录 00. 目录 01. 主机序到网络序转换函数 02. 网络序到主机序转换函数 03. inet_pton函数 04. inet_ntop函数 05. 附录 01. 主机序到网络 ...

  3. 【linux网络编程】网络字节序、地址转换

    网络字节序 故事的起源 "endian"这个词出自<格列佛游记>.小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endia ...

  4. TCP/IP,网络字节序与本地转换,Linux提供的转换函数htonl,htons等,sock_addr的数据结构与内容

    TCP/IP,网络字节序与本地转换,Linux提供的转换函数htonl,htons等,sock_addr的数据结构与内容 一.网络字节序存储方式: 小端存储:高位存放高地址,0x12345678的小段 ...

  5. Java字节序,java整型数与网络字节序 byte[] 数组转换关系(ByteArrayOutputStream用法)

    Java字节序 http://origin100.iteye.com/blog/267165 /** * 通信格式转换 * * Java和一些windows编程语言如c.c++.delphi所写的网络 ...

  6. Java字节序,java整型数与网络字节序 byte[] 数组转换关系

    Java字节序 http://origin100.iteye.com/blog/267165 /** * 通信格式转换 * * Java和一些windows编程语言如c.c++.delphi所写的网络 ...

  7. java byte(字节_Java字节序,java整型数与网络字节序 byte[] 数组转换关系(ByteArrayOutpu......

    /** * 通信格式转换 * * Java和一些windows编程语言如c.c++.delphi所写的网络程序进行通讯时,需要进行相应的转换 * 高.低字节之间的转换 * windows的字节序为低字 ...

  8. Linux网络编程笔记 - 05 地址转换函数 32位整数,转换为点分十进制

    #include <arpa/inet.h> const char *inet_ntop(int af, const void *src,char *dst, socklen_t size ...

  9. ip地址转换数字函数 iton_IP地址转换函数

    在ASCII字符串("192.168.0.99")与网络字节序的二进制值间转换地址. 涉及函数的头文件为#include 一.只适用于IPv4协议的函数: int inet_ato ...

最新文章

  1. python互斥锁_Python多线程如何使用互斥锁
  2. Python之Pandas库学习(一):简介
  3. 安徽工业大学计算机考研调剂,安徽工业大学2019年考研预调剂公告
  4. 1.18 StringBuffer替换特殊字符
  5. vnc连接linux使用教程_vnc的使用方法,vnc的使用方法,教程详解
  6. BeanFactory 和ApplicationContext 有什么区别?
  7. android+ import R错误
  8. Replace Parameter with Explicit Methods(以明确函数取代参数)
  9. ipython和jupyter哪个好_对Python开发者而言,IPython仍然是Jupyter Notebook的核心
  10. 管理站点复制 【Windows Server 2019】活动目录(Acitve Directory)——在同一区域安装多台域控制器
  11. python标准函数什么意思_python中quote函数是什么意思,怎么用
  12. linux手误rm可能不需要跑路
  13. 开店软件透彻分析推荐
  14. Unity NGUI 之 UIScrollView 基本用法
  15. 折腾!在树莓派上运行DOS
  16. Linux SD卡驱动开发
  17. 有意思的atoll函数
  18. CAN总线隔离器介绍
  19. c语言在数学方面的应用编程,浅谈数学在C语言编程中的应用.doc
  20. 完全免费的中药管理软件

热门文章

  1. Adobe Acrobat Pro DC 鼠标中键滚轮页面滑动速度太慢解决办法
  2. Python GUI项目:古诗词鉴赏系统
  3. 金融财务工作汇报PPT模板
  4. 互联网公司笔试-逻辑推理题及解答【精选100道】
  5. BDD100k数据集的 lane的可视化标签
  6. 别不信,学IT这些网站够猛!
  7. 黑子链sust是什么?
  8. 涨知识!住建局如何利用“千里眼”实现对建筑工地的远程监管?
  9. linux qq rpm最新版,腾讯重新发布QQ Linux版,完美适配新支点国产操作系统
  10. CCIE Routing Switching备考指南2007版