1.把ip地址转化为用于网络传输的二进制数值

int inet_aton(const char *cp, struct in_addr *inp);

inet_aton() 转换网络主机地址ip(如192.168.1.10)为二进制数值,并存储在struct in_addr结构中,即第二个参数*inp,函数返回非0表示cp主机有地有效,返回0表示主机地址无效。(这个转换完后不能用于网络传输,还需要调用htons或htonl函数才能将主机字节顺序转化为网络字节顺序)

in_addr_t inet_addr(const char *cp);

inet_addr函数转换网络主机地址(如192.168.1.10)为网络字节序二进制值,如果参数char *cp无效,函数返回-1(INADDR_NONE),这个函数在处理地址为255.255.255.255时也返回-1,255.255.255.255是一个有效的地址,不过inet_addr无法处理;

2.将网络传输的二进制数值转化为成点分十进制的ip地址

char *inet_ntoa(struct in_addr in);

inet_ntoa 函数转换网络字节排序的地址为标准的ASCII以点分开的地址,该函数返回指向点分开的字符串地址(如192.168.1.10)的指针,该字符串的空间为静态分配的,这意味着在第二次调用该函数时,上一次调用将会被重写(复盖),所以如果需要保存该串最后复制出来自己管理!

我们如何输出一个点分十进制的IP呢?我们来看看下面的程序:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
int main()
{   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里面的可变参数的求值是从右到左的,仅此而已。

3.新型网路地址转化函数inet_pton和inet_ntop
这两个函数是随IPv6出现的函数,对于IPv4地址和IPv6地址都适用,函数中p和n分别代表表达(presentation)和数值(numeric)。地址的表达格式通常是ASCII字符串,数值格式则是存放到套接字地址结构的二进制值。

#include <arpe/inet.h>
int inet_pton(int family, const char *strptr, void *addrptr);     //将点分十进制的ip地址转化为用于网络传输的数值格式返回值:若成功则为1,若输入不是有效的表达式则为0,若出错则为-1const char * inet_ntop(int family, const void *addrptr, char *strptr, size_t len);     //将数值格式转化为点分十进制的ip地址格式返回值:若成功则为指向结构的指针,若出错则为NULL

(1)这两个函数的family参数既可以是AF_INET(ipv4)也可以是AF_INET6(ipv6)。如果,以不被支持的地址族作为family参数,这两个函数都返回一个错误,并将errno置为EAFNOSUPPORT.

(2)第一个函数尝试转换由strptr指针所指向的字符串,并通过addrptr指针存放二进制结果,若成功则返回值为1,否则如果所指定的family而言输入字符串不是有效的表达式格式,那么返回值为0.

(3)inet_ntop进行相反的转换,从数值格式(addrptr)转换到表达式(strptr)。inet_ntop函数的strptr参数不可以是一个空指针。调用者必须为目标存储单元分配内存并指定其大小,调用成功时,这个指针就是该函数的返回值。len参数是目标存储单元的大小,以免该函数溢出其调用者的缓冲区。如果len太小,不足以容纳表达式结果,那么返回一个空指针,并置为errno为ENOSPC。

4.示例

inet_pton(AF_INET, ip, &foo.sin_addr);   //  代替 foo.sin_addr.addr=inet_addr(ip);char str[INET_ADDRSTRLEN];
char *ptr = inet_ntop(AF_INET,&foo.sin_addr, str, sizeof(str));      // 代替 ptr = inet_ntoa(foo.sin_addr)

inet_pton()和inet_ntop()函数详解相关推荐

  1. htons/ntohs、inet_aton/inet_ntoa、inet_pton/inet_ntop函数详解

    在介绍htons等函数之前,必须先介绍网络字节序与主机字节序 网络字节序和主机字节序 网络字节顺序NBO(Network Byte Order): 按从高到低的顺序存储,在网络上使用统一的网络字节顺序 ...

  2. inet_pton()和inet_ntop()函数使用实例

    概述 IP格式最常见的是使用点分10进制表示,如: xx.xx.xx.xx (IPV4地址). IP地址分为两类:IPv4地址和IPv6地址. IPv4 地址用32位来表示: IPv6 地址用128位 ...

  3. C语言网络编程:accept函数详解

    文章目录 前言 函数描述 代码实例 如何得到客户端的IP 和 端口号 前言 当使用tcp服务器使用socket创建通信文件描述符,bind绑定了文件描述符,服务器ip和端口号,listen将服务器端的 ...

  4. 【FFmpeg】函数详解(三)

    FFmpeg函数详解 14.av_write_frame 15.av_interleaved_write_frame 16.av_write_trailer 17.avio_close 18.av_i ...

  5. 【FFmpeg】函数详解(二)

    FFmpeg函数详解 9.av_dump_format 10.avio_open 11.avformat_write_header 12.avcodec_send_frame 13.avcodec_r ...

  6. 【FFmpeg】函数详解(一)

    FFmpeg函数详解 一.错误码相关 1.AVERROR 2.av_strerror 3.其他错误码解释 二.编解码 1.获取编解码器 2.申请.释放上下文环境 3.打开编码器avcodec_open ...

  7. 【ES6】Generator函数详解

    [ES6]Generator函数详解 一.Generator函数简介 基本概念 函数写法 yield关键字介绍 二.next方法的参数 三.for...of循环 四.关于普通throw()与Gener ...

  8. mysql的聚合函数综合案例_MySQL常用聚合函数详解

    一.AVG AVG(col) 返回指定列的平均值 二.COUNT COUNT(col) 返回指定列中非NULL值的个数 三.MIN/MAX MIN(col):返回指定列的最小值 MAX(col):返回 ...

  9. python平方数迭代器_对python中的高效迭代器函数详解

    python中内置的库中有个itertools,可以满足我们在编程中绝大多数需要迭代的场合,当然也可以自己造轮子,但是有现成的好用的轮子不妨也学习一下,看哪个用的顺手~ 首先还是要先import一下: ...

最新文章

  1. 最大识车数据集:6.4万张车型参数完整标注,交通安防二手都能用
  2. linux shell 计算时间差
  3. 智能指针weak_ptr
  4. C#如何判断程序调用的exe已结束
  5. 优秀程序员的 18 大法则【转载】
  6. 计算机图形学E9——裁剪——固定矩形窗口裁剪多边形(凸多边形/凹多边形)
  7. 使用WindowsXP中的网桥功能
  8. 【前沿】PurdueUCLA提出梯度Boosting网络,效果远好于XGBoost模型!
  9. 从SQL到NoSQL—如何使用表格存储
  10. 聊聊spring data jpa的JpaQueryLookupStrategy
  11. *BZOJ2330: [SCOI2011]糖果
  12. GNS3+JunOS
  13. html设置背景图片自动适应屏幕大小,css适应屏幕 CSS背景图片自适应屏幕大小
  14. 学计算机应用必备的软件,电脑装机六大必备软件神器推荐
  15. 微软模拟飞行10厦门航空涂装_《微软模拟飞行》——准备起飞!
  16. 网络游戏营销植入案例
  17. PS第三课--套索和魔棒工具
  18. unity源码怎么变成游戏_传奇是怎么从最不“烧钱”的游戏变成最“烧钱”的游戏的...
  19. 【HD Tune变红/警告】硬盘 SMART 检测参数详解
  20. vue启动报错98% after emitting CopyPlugin This dependency was not found:

热门文章

  1. 汉字转拼音c/c++源码,支持gb2312和utf8
  2. 黑苹果英特尔网卡_苹果可能放弃英特尔,设计自己的Mac处理器
  3. fone返利云受邀出席中国汽车行业流通年会,返利云总经理与大家探讨如何提高汽车4S店的经营利润
  4. Java 发送会议邀请到 Outlook
  5. 新来的23岁Java开发上来秀了波操作,真的是扮猪吃老虎
  6. EZStation如何添加解码器?
  7. 电脑之间通过串口、网口数据通信
  8. 智慧街区规划方案 PPT
  9. 探究2020版《网上银行系统信息安全通用规范》的新变化
  10. 《计算机科学概论》—第1章1.2节计算的历史