UNIX网络编程学习笔记2 需要用到的一些字节操纵和格式转换函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UNIX网络编程学习笔记2 需要用到的一些字节操纵和格式转换函数相关的知识,希望对你有一定的参考价值。
当然这些东西是炒鸡无聊的,但是真当自己开始撸代码时才发现熟悉这些枯燥的函数能够节约大量的时间。于是总结一下:
字节序:低序字节存储在起始地址,这称为小端(little-endian),高序字节存储在起始地址,这称为大端(big-endian)
例:存放0x0A0B0C0D
LE: 0D 0C 0B 0A
BE: 0A 0B 0C 0D
小端的存放方式更加接近于人类思维
网际协议使用大端字节序来传送多字节整数(为何要规定一个字节序来传输ip和port? 呸 这样子协议才能正确“看懂”(解释)这些地址 你自己的数据当然可以不转 不过客户端和服务端解释数据的方式(字节序)要统一 自己的数据并不是协议的内容 所以不必用协议的规范来约束自己的数据 不过当然转了更好 谁叫大家都这样做0.0)
下面是字节排序函数:
1 #include<netinet /in.h> 2 unit16_t htons(uint16_t host16bitvalue); 3 unit32_t htonl(uint32_t host32bitvalue);//上面两个返回网络字节序(BE)的值,下面两个返回主机字节序(由实现定义)的值 4 uint16_t ntohs(uint16_t net16bitvalue); 5 unit32_t nothl(unit32_t net32bitvalue);
这些函数的名字中,h代表host,n代表network,s代表short,l代表long。
由于这些东西都是老古董,所以此处的s和l分别应该视为一个16位的值和一个32位的值。
两个使用排序函数的例子:设置ipv4套接字地址时 -> servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
绑定端口时 -> servaddr.sin_port = htons(13);
接下来要说明的是一些字节操纵函数:
1 #include<strings.h> 2 void bzero(void *dest, size_t nbytes); 3 void bcopy(const void *src, void *dest, size_t nbytes); 4 int bcmp(const void *ptr1, const void *ptr2, size_t nbytes);//相等返回0,不相等返回非0.与memcmp不同。
没什么好说的,这些东西和mem*这类函数差不多(允许我这个正则渣渣用一个逗比的通配符23333)只不过更方便了,一个技巧识别这些函数和mem*函数的区别就是看const限定符,反正函数是从有这个限定符的参数中取值的。
地址转换函数:
ipv4:
1 #include<arpa/inet.h> 2 int inet_aton(const char *strptr, struct in_addr *addrptr);//若字符串有效返回1, 否则返回0。 3 in_addr_t inet_addr(const char *strptr);//这个函数已经被废弃 4 char *inet_ntoa(struct in_addr inaddr);//返回一个指向点分十进制数串的指针。
这里的三个函数暂时没啥好讨论的 我们来看一下下面两个新函数:
两个新函数:
#include<arpa/inet.h> 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。
这两个函数是对ipv4和ipv6都适用的,family参数可以是两个(AF_INET, AF_INET6)如果以不被支持的地址族作为参数,则这两个函数都会返回一个错误,并将errno置为EAFNOSUPPORT(Address family not supported by protocol)。
函数名中的p代表“表达”(presentation) n代表“数值”(numeric)
说啥都不如一个例子来得快23333(其实是懒,就问你们桌面6不6)
(上面这个程序如果不声明套接字地址结构的话就会报段错误,然而我自己并未用到那个结构,估计和函数实现有关,留待日后解决)
关于len参数:len参数是目标存储单元的大小,以免该函数溢出其调用者的缓冲区。为有助于指定这个大小,定义了如下常数:
1 #include<netinet/in.h> 2 #define INET_ADDRSTRLEN 16 3 #define INET6_ADDRSTRLEN 46
如len过小不足以容纳表达式结果,那么返回一个NULL,并置errno为ENOSPC(No space left on device).
来张图总结一下五个函数(书上图):
好了 这次写到这暂时歇歇 其实本来要把书上给的非标准函数和这章的I\\O也总结一下
可是突然不想写了 任性 23333
给自己的理由是有关于这篇文章的名字所包含的内容
已经总结完成 <---套路O(∩_∩)O蛤蛤蛤
以后还会继续努力的 嗯 就酱。
以上是关于UNIX网络编程学习笔记2 需要用到的一些字节操纵和格式转换函数的主要内容,如果未能解决你的问题,请参考以下文章