字节排序函数
在不同的系统中会使用两种不同的方式存储数据,即大端字节序和小端字节序。大端字节序是指将数据的有效位从起始地址开始由高到低依次存入内存,小端字节序则相反。
网际协议使用大端字节序传送数据,而由于系统的不同,主机使用的数据存储方式是不确定的。所以要用到将数据在主机字节序和网络字节序间转换的函数。
#inlcude <netinet/in.h>
unit16_t htons(uint16_t host16bitvalue);
unit32_t htonl(uint32_t host32bitvalue);
unit16_t ntohs(uint16_t net16bitvalue);
unit32_t ntohl(uint32_t net32bitvalue);
//h,n分别代表host和net,函数功能由函数名即可知
字节操纵函数
由于我们要操作的字段不一定是一空字符结尾的C字符串,所以不能使用在string.h头文件下定义的str打头的字符串处理函数。而要使用另外的函数,它们既不对数据作解释,也不假设数据以空字符结束。下面是定义在两组不同头文件下的函数。
- mem开头的这组函数是定义在string.h下的ANSI C函数
#include <string.h>
void *memset(void *dest, int c, size_t len);//将目标字节串指定数目的字节置为c
void *memcpy(void *dest, const void *src, size_t nbytes);//将指定数目的字节从src拷贝到dest
int memcmp(const void *ptr1, const void *ptr2, size_t nbytes);//比较前n个字节,相等返回0,ptr1>ptr2 返回值大于0,否则小于0
- b开头的这组函数是源于BSD系统,定义在stings.h中,它不是ANSI C函数。
void bzero(void *dest, size_t nbytes); //将指定数目的字节置为0
void bcopy(const void *src, void *dest, size_t nbytes); //同memcpy
int bcmp(const void *ptr1, const void *ptr2, size_t nbytes); /* 相同返回0,否则返回非0
地址转换函数
地址转换函数用于在ASCII字符串和网络字节序的二进制串之间转换网际地址。
-
inet_aton, inet_addr, inet_ntoa
这组函数在点分十进制(例“202.168.1134.101”)与长度为32位的网络字节序二进制值之间转换IPv4地址。
#include <arpa/inet.h>
int inet_aton(const char *strptr, struct in_addr *addptr);//将字符串strptr转换成32位网络字节序二进制值,存入addptr,若字符串有效返回1,否则为0
int_addr_t inet_addr(const char *strptr);//进行与inet_aton相同的转换,返回32位二进制值
char *inet_ntoa(struct in_addr inaddr);//将32位网络字节序二进制值转换为点分十进制数串
-
inet_pton, inet_ntop
这组函数对于IPv4和IPv6都适用。函数名中p表示表达(presentation),n表示数值(numeric)。地址的表达格式通常为ASCII字符串,数值格式则是存放在套接字地址结构中的二进制值。
这两个函数的family参数可以是AF_INET 或AF_INET6,用来区分IPv4和IPv6。
inet_pton函数转换字符串strptr,将二进制结构存入addrptr,如果成功返回1,否则返回0.
inet_ntop进行相反的转换,将数值格式(addrptr)转换到表达格式(strptr),len是目标存储单元的大小(即sizeof(strptr))。调用成功则返回目标存储单元的指针。
#include <arpa/inet.h>
int inet_pton(int family, const char *strptr, void *addrptr);
const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);