Socket中常见的几个转换函数(htonl,htons,ntohl,ntohs,inet_addr,inet_ntoa)

  htonl() htons() ntohl() ntohs()及inet_ntoa() inet_addr()的用法

  注:其中的h表示“host”,n表示“net”,l表示“long”,

 
s表示“short”a表示“ascii”,ddr表示“in_addr结构体”

  现在我们很幸运,因为我们有很多的函数来方便地操作 IP 地址。没有
必要用手工计算它们,也没有必要用"一个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()。

  现在你可以将IP地址转换成长整型了。有没有其相反的方法呢? 它可以将一个in_addr结构体输出成点数格式?这样的话,你就要用到函数 inet_ntoa()("ntoa"的含义是"network to ascii"),就像这样:

  printf("%s",inet_ntoa(ina.sin_addr));

  它将输出IP地址。需要注意的是inet_ntoa()将结构体in-addr作为一
个参数,不是长整形。同样需要注意的是它返回的是一个指向一个字符的指针。它是一个由inet_ntoa()控制的静态的固定的指针,所以每次调用
inet_ntoa(),它就将覆盖上次调用时所得的IP地址。例如:

  char *a1, *a2;

  a1 = inet_ntoa(ina1.sin_addr); /* 这是198.92.129.1 */

  a2 = inet_ntoa(ina2.sin_addr); /* 这是132.241.5.10 */

  printf("address 1: %s ",a1);

  printf("address 2: %s ",a2);

  输出如下:

  address 1: 132.241.5.10

  address 2: 132.241.5.10

  内存结构:

  

  

  

  假如你需要保存这个IP地址,使用strcpy()函数来指向你自己的字符指针。

  ==================================================================

  htonl()表示将32位的主机字节顺序转化为32位的网络字节顺序 htons()表示将16位的主机字节顺序转化为16位的网络字节顺序(ip地址是32位的端口号是16位的 )

  inet_ntoa()

  简述:

  将网络地址转换成“.”点隔的字符串格式。

  #include

  char FAR* PASCAL FAR inet_ntoa( struct in_addr in);

  in:一个表示Internet主机地址的结构。

  注释:

  本函数将一个用in参数所表示的Internet地址结构转换成以“.”
间隔的诸如“a.b.c.d”的字符串形式。请注意inet_ntoa()返回的字符串存放在WINDOWS套接口实现所分配的内存中。应用程序不应假设
该内存是如何分配的。在同一个线程的下一个WINDOWS套接口调用前,数据将保证是有效。

  返回值:

   若无错误发生,inet_ntoa()返回一个字符指针。否则的话,返回NULL。其中的数据应在下一个WINDOWS套接口调用前复制出来。

  参见:

  inet_addr().

  测试代码如下

  include

  #include

  #include

  #include

  #include

  int main(int aargc, char* argv[])

  {

  struct in_addr addr1,addr2;

  ulong   l1,l2;

  l1= inet_addr("192.168.0.74");

  l2 = inet_addr("211.100.21.179");

  memcpy(&addr1, &l1, 4);

  memcpy(&addr2, &l2, 4);

  printf("%s : %s\n", inet_ntoa(addr1), inet_ntoa(addr2));    //注意这一句的运行结果

  printf("%s\n", inet_ntoa(addr1));

  printf("%s\n", inet_ntoa(addr2));

  return 0;

  }

  实际运行结果如下:

  192.168.0.74 : 192.168.0.74       //从这里可以看出,printf里的inet_ntoa只运行了一次。

  192.168.0.74

  211.100.21.179

  inet_ntoa返回一个char *,而这个char *的空间是在inet_ntoa里面静态分配的,所以inet_ntoa后面的调用会覆盖上一次的调用。第一句printf的结果只能说明在printf里面的可变参数的求值是从右到左的,仅此而已。

Socket中常见的几个转换函数(htonl,htons,ntohl,ntohs,inet_addr,inet_ntoa)的更多相关文章

  1. 【网络】IP地址格式转换(htonl、ntohl;inet_addr、inet_ntoa)

    1.htonl ()和ntohl( ) u_long PASCAL FAR ntohl (u_long netlong); u_short PASCAL FAR ntohs (u_short nets ...

  2. IP地址格式转换(htonl、ntohl;inet_addr、inet_ntoa)

    名词解析: 主机字节序: 不同的CPU有不同的字节序类型,这些字节序是指整数在内存中保存的顺序,这个叫做主机序.最常见的有两种 1.Little endian:低字节存高地址,高字节存低地址 2.Bi ...

  3. 【VS开发】IP地址格式转换(htonl、ntohl;inet_addr、inet_ntoa)

    1.htonl ()和ntohl( ) u_long PASCAL FAR ntohl (u_long netlong); u_short PASCAL FAR ntohs (u_short nets ...

  4. C++中的各种进制转换函数汇总

    C++中的各种进制转换函数汇总 1.在C中,按指定进制格式输出如下: #include <iostream> #include <cstdio> using namespace ...

  5. socket编程为什么需要htons(), ntohl(), ntohs(),htons() 函数

    在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题.这是就可能用到htons(), ntohl(), ntohs(),htons()这4个函数. 网络字节顺序与本地字节顺序之间的转 ...

  6. 转:为什么需要htons(), ntohl(), ntohs(),htons() 函数

    为什么需要htons(), ntohl(), ntohs(),htons() 函数: 在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题.这是就可能用到htons(), ntohl ...

  7. htons(), ntohl(), ntohs(),htons()这4个函数(摘)

    在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题.这是就可能用到htons(), ntohl(), ntohs(),htons()这4个函数.网络字节顺序与本地字节顺序之间的转换 ...

  8. 网络编程中常见地址结构与转换(IPv4/IPv6)

    1. sockaddr/sockaddr_in/in_addr (IPv4).sockaddr6_in/in6_addr/addrinfo (IPv6) struct sockaddr { unsig ...

  9. php中常用的字符串大小写转换函数实例解释

    PHP字符串处理函数中,最为简单的几个函数,相关解释就不上了,直接看例子. PHP字符串处理函数中,最为简单的几个函数,相关解释就不上了,直接看例子. strtolower函数.strtoupper函 ...

随机推荐

  1. HDFS相关概念

    数据块 每个磁盘都有默认的数据块大小,这是磁盘进行数据读写的最小单位.构建与单个磁盘之上的文件系统通过磁盘块来管理该文件系统中的快.该文件系统块的大小可以使磁盘块的整数倍.文件系统块一般为几千字节,而 ...

  2. Shell脚本报错--syntax error near unexpected token for((i=0;i<$length;i++))

    现象: shell脚本使用Nodepad++进行本地编辑,在编辑后上传到linux机器进行执行时提示“syntax error near unexpected token for((i=0;i< ...

  3. BZOJ3241/UOJ125 [Noi2013]书法家

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  4. Codeforces Round #280 (Div. 2) D. Vanya and Computer Game 数学

    D. Vanya and Computer Game time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  5. PHP 图片操作(按照指定尺寸压缩,按照比例裁剪)

    提供二个常用的图片处理方法: 1.按照指定的尺寸压缩图片 /** * 按照指定的尺寸压缩图片 * @param $source_path 原图路径 * @param $target_path 保存路径 ...

  6. 2016/05 - Mars ISC 面试过程全记录

    一.Mars phone interview 还记得当时我接到Mars phone interview的时候我还和女友在成都玩,真是[好事多磨 x1],猎头通知可能下午会打电话,早早的吃完午饭我就准备 ...

  7. Spring_学习_00_资源帖

    一.官方文档 1.Spring Framework Documentation 二.参考书籍 1.< Spring实战 (第四版)> 三.参考资料

  8. 剑指offer--11.数组中出现次数超过一半的数字

    unique(), count()函数好用 ---------------------------------------------------------------------- 时间限制:1秒 ...

  9. awk---Linux下文本处理五大神器之二

    转自:http://www.cnblogs.com/dong008259/archive/2011/12/06/2277287.html awk是一个非常棒的数字处理工具.相比于sed常常作用于一整行 ...

  10. 异常:SQL Error: 1064, SQLState: 42000

    在MySQL中,有很多字符被MySQL保留了.如果你用来做列名或者表名就会出现问题. 我这里出现的问题是采用了order作为表明,这是一个保留字,所以出现问题.