socket的那些事-字节序及网络下相关类转换函数整理(atoi,htons)

网络编程api中socket是一个很好用的工具,但是从字符或者数值到网络可以使用中间还是要有转换的。所以这一章用来总结一下socket编程中的那些转换函数。

atoi

最简单的一个函数,常见于:

int port = atoi( argv[2] );

atoi的作用很简单,其原型如下:

int atoi(const char* str);

很明显,就是将str所指字符串转换为int型整数。

主机字节序和网络字节序

首先解释一下这两个是什么:

  1. 网络字节序(Network byte order):按从高到低的顺序存储,这样所有的网络上均一致,可以互相识别交流。
  2. 主机字节序(Host byte order):与主机CPU设计有关,高位存储或者低位存储。

所以,两个主机之间如果字节序不同是无法进行通信的,所以我们约定好交接的格式,这样在网络上碰到时就能互相认出对方,拿到东西后再转换回去就能识别到本地主机上,这样就能完成一次网络传输。
所以,这就需要转换函数及转回函数。

  1. htonl:host to network long
  2. ntohl:network to host long
  3. htons:host to network short
  4. ntohs:network to host short

Linux下定义及头文件如下:

	#include  
	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系列

首先是头文件:

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);

这几个函数都比较简单,可以自己试着测试一下甚至实现一下,不求甚解直接套用即可。
改天有空自己实现或者测试一下补充到这里,困了,先睡了。

你可能感兴趣的:(网络,socket)