网络编程api中socket是一个很好用的工具,但是从字符或者数值到网络可以使用中间还是要有转换的。所以这一章用来总结一下socket编程中的那些转换函数。
atoi
最简单的一个函数,常见于:
int port = atoi( argv[2] );
atoi的作用很简单,其原型如下:
int atoi(const char* str);
很明显,就是将str所指字符串转换为int型整数。
主机字节序和网络字节序
首先解释一下这两个是什么:
- 网络字节序(Network byte order):按从高到低的顺序存储,这样所有的网络上均一致,可以互相识别交流。
- 主机字节序(Host byte order):与主机CPU设计有关,高位存储或者低位存储。
所以,两个主机之间如果字节序不同是无法进行通信的,所以我们约定好交接的格式,这样在网络上碰到时就能互相认出对方,拿到东西后再转换回去就能识别到本地主机上,这样就能完成一次网络传输。
所以,这就需要转换函数及转回函数。
- htonl:host to network long
- ntohl:network to host long
- htons:host to network short
- ntohs:network to host short
Linux下定义及头文件如下:
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
Windows下使用时可以自查。
简单来讲就是去网上交换就换成network规则,回来就改回host。
inet_xxx系列
首先是头文件:<arpa/inet.h>
inet_addr是网络编程中常用的一个函数,原型如下:
in_addr_t inet_addr(const char *str);
返回值是一个无符号长整数型,作用就是将后面的点分十进制的IP转换为长整型数。
inet_addr("127.0.0.1");//字符串IP转化为网络字节序的整型值
inet_aton将一个字符串IP地址转换为一个32位的网络序列IP存在addr中。原型如下:
int inet_aton(const char *string, struct in_addr *addr);
inet_ntoa将网络字节序IP(结构体in_addr型)转化为点分十进制的IP地址。函数原型如下:
char *inet_ntoa(struct in_addr in);
这几个函数都比较简单,可以自己试着测试一下甚至实现一下,不求甚解直接套用即可。
改天有空自己实现或者测试一下补充到这里,困了,先睡了。