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. Bluetooth Profile for iPhone from the functional perspectives

    Classic Bluetooth Profile for iPhone from the functional perspectives Function Description BT Profil ...

  2. R语言笔记006——分组获取描述性统计量

    方法一:使用aggregate()分组获取描述性统计量 aggregate(mtcars[vars],by=list(am=mtcars$am),mean) aggregate(mtcars[vars ...

  3. C#加密解密DES字符串<转>

    using System; using System.Collections.Generic; using System.Text; using System.Security.Cryptograph ...

  4. mvn 用指定setting.xml 执行指定pom.xml

    mvn package -f pom.xml -s setting.xml clean install

  5. codeforces 777C.Alyona and Spreadsheet 解题报告

    题目链接:http://codeforces.com/problemset/problem/777/C 题目意思:给出一个 n * m 的矩阵,然后问 [l, r] 行之间是否存在至少一列是非递减序列 ...

  6. 实现继承+接口继承+虚方法+隐藏方法+this/base+抽象类+密封类/方法+修饰符

    概念: 在上一节课中学习了如何定义类,用类当做模板来声明我们的数据. 很多类中有相似的数据,比如在一个游戏中,有Boss类,小怪类Enemy,这些类他们有很多相同的属性,也有不同的,这个时候我们可以使 ...

  7. Memcache笔记(1)

    缓存主要分为:页面缓存和数据缓存 Memcache .redis.mongodb都是做数据缓存的 Memcache是什么? 是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的ha ...

  8. iTerm2 + Oh My Zsh

    iTerm2 http://iterm2.com/downloads.html https://iterm2.com/downloads/stable/iTerm2-2_1_4.zip Oh My Z ...

  9. 总结一下内核DEBUG中的dump_stack, BUG, BUG_ON以及panic

    有点空闲时间,让我们来总结一下内核DEBUG中的各个语句吧.随便找个内核驱动,在init函数里面加入如下代码测试: u8 a = 1, b = 0; printk("----------du ...

  10. 验证实现element-ui树形控件的自定义图标及右键菜单

    许久不用,element-ui已经更新至2.4.1版本.直接进入今天的正题,前提是node.js的环境还有vue及elment-ui都已经安装.由于element-ui的官方文档中介绍比较粗略,试了许 ...