Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1690375
  • 博文数量: 410
  • 博客积分: 9563
  • 博客等级: 中将
  • 技术积分: 4517
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-03 19:59
个人简介

文章分类

全部博文(410)

文章存档

2017年(6)

2016年(1)

2015年(3)

2014年(4)

2013年(32)

2012年(45)

2011年(179)

2010年(140)

分类: LINUX

2010-08-24 09:25:58




主机字节序转换到网络字节序列的原理:
网 络字节序列采用低字节在高位的排列方式,
而X86主机字节序列采用低字节在低位的方式
其 实只要交换一下就可以实现网络字节序列和主机字节序列的转换,
所以对于上面的函数,htonl和ntohl是一样的。
  h   host   主机  
  n   net     网络  
  l   long   长整形  
  s   short   短整形  
  XtoX就是进行数据存储顺序的主机和网络顺序的转换
htonl和htons分别把无符号长整型和无符号短整型数字转换成TCP/IP协议规定的统一的网络字节序的数字,即大头序。不同体系的计算 机存储数字时有些把最低位放在前面,另一些相反,即所谓大头和小头。数字进入Internet时应先用htonl或htons转换成统一的大头序。
 
htonl(将32位主机字符顺序转换成网络字符顺序) 
定义函数  unsigned long int htonl(unsigned long int hostlong);
 
函数说明  htonl()用来将参数指定的32位hostlong 转换成网络字符顺序。
 
返回值  返回对应的网络字符顺序。
 
htons(将16位主机字符顺序转换成网络字符顺序)   
定义函数  unsigned short int htons(unsigned short int hostshort);
 
函数说明  htons()用来将参数指定的16位hostshort转换成网络字符顺序。
 
返回值  返回对应的网络字符顺序。
ntohl(将32位网络字符顺序转换成主机字符顺序) 
定义函数  unsigned long int ntohl(unsigned long int netlong);
 
函数说明  ntohl()用来将参数指定的32位netlong转换成主机字符顺序。
 
返回值  返回对应的主机字符顺序。
 
 
ntohs(将 16位网络字符顺序转换成主机字符顺序)  
 
定义函数  unsigned short int ntohs(unsigned short int netshort);
 
函数说明  ntohs()用来将参数指定的16位netshort转换成主机字符顺序。
 
返回值  返回对应的主机顺序。
比如网络字节 为 00 01
u_short    a;   // a=0100; 因为主机是从高字节到低字节的,所以应该转化后
a=ntohs(0001); //这样 a=0001;
 
假设你已经有了一个sockaddr_in结构体ina,你有一个IP地 址"132.241.5.10" 要储存在其中,你就要用到函数inet_addr(),将IP地址从 点 数格式转换成无符号长整型。使用方法如下:
ina.sin_addr.s_addr = inet_addr(“132.241.5.10″);
注意,inet_addr()返回的地址已 经是网络字节格式,所以你无需再调用函数htonl()。
 
 
inet_addr(将网络地址转成二进制的数字)  
定义函数  unsigned long int inet_addr(const char *cp);
 
函数说明  inet_addr()用来将参数cp所指的网络地址字符串转换成网络所使用的二进制数字。网络地址字符串是以数字和点组成的字符串,例 如:“163.13.132.68”。
 
返回值  成功则返回对应的网络二进制的数字,失败返回-1。
 
//ntoa:network to ascii
//aton:ascii to network 
 
inet_aton(将网络地址转成网络二进制的数字) 
定义函数  int inet_aton(const char * cp,struct in_addr *inp);
 
函数说明  inet_aton()用来将参数cp所指的网络地址字符串转换成网络使用的二进制的数字,然后存于参数inp所指的in_addr结构中。
结构 in_addr定义如下
struct in_addr
{
unsigned long int s_addr;
};
 
返 回值  成功则返回非0值,失败则返回0。
 
 
 
inet_ntoa(将网络二进制的数字转换成网络 地址) 
定义函数  char * inet_ntoa(struct in_addr in);
 
函数说 明  inet_ntoa()用来将参数in所指的网络二进制的数字转换成网络地址,然后将指向此网络地址字符串的指针返回。( 将网络地址转换成“.”点隔的字符串格式)
 
返回值  成功则返回字符串指针,失败则返回NULL。

 原文地址 http://fengmenghello.blog.163.com/blog/static/164620330201051755850234/

阅读(1499) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~