网络编程inet_pton inet_ntop inet_addr htonl htons ntohl ntohs

网络编程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);
将网络字节序二进制值转换成点分十进制串。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值