网络编程inet_pton inet_ntop inet_addr htonl htons ntohl ntohs
把给定系统所采用的字节序成为主机字节序,为了避免不同类型主机之间在数据交换的时候育有对于字节序的不同而导致的差错,引入网络字节序。
例一:IP地址的主机字节序与网络字节序的转换以用IP地址:127.0.0.1为例
第一步 127 . 0 . 0 . 1 把IP地址每一部分转换为8位的二进制数。
第二步 01111111 00000000 00000000 00000001 = 2130706433 (主机字节序)
然后把上面的四部分二进制数从右往左按部分重新排列,那就变为:
第三步 00000001 00000000 00000000 01111111 = 16777343 (网络字节序)
internet协议地址结构体中,in_addr.sin_addr必须是负值IP地址的网络字节序
htonl是上述第二步到第三步的转换
inet_addr是上述第一步到第三步的转换
addrSrv.sin_addr.S_un.S_addr=htonl(2130706433);这句还可以写为:
addrSrv.sin_addr.S_un.S_addr=inet_addr(“127.0.0.1”); 结果是完全一样的。
例二:端口的主机字节序与网络字节序的转换。以6000端口为例
端口号其实就已经是主机字节序了,首先要把端口号写为16位的二进制数,分前8位和后8位。
第一步 00010111 01110000 = 6000 (主机字节序)
然后把主机字节序的前八位与后八位调换位置组成新的16位二进制数,这新的16位二进制数就是网络字节序的二进制表示了。
第二步 01110000 00010111 = 28695 (网络字节序)
如果你知道6000端口的网络字节序是28695的话。
addrSrv.sin_port=htons(6000);还可以写为
addrSrv.sin_port=28695;结果是一样的,
网络字节序与主机字节序互转 (例1一中的第二步到第三步;例2的第一步到第二步)
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
点分十进制串转换成网络字节序(例一中的第一步到第三步)
int inet_pton(int family,const char * strptr,void * addrptr);功能同inet_addr
将点分十进制串转换成网络字节序二进制值,此函数对IPv4地址和IPv6地址都能处理。
const char * inet_ntop(int family,const void *addrptr,char * strptr,size_t len);
将网络字节序二进制值转换成点分十进制串。