inet_addr()

 

  简述:将一个点间隔地址转换成一个in_addr。
  #include <winsock.h>
  unsigned long PASCAL FAR inet_addr( const struct FAR* cp);
  cp:一个以Internet标准“.”间隔的字符串。
  注释:
  本函数解释cp参数中的字符串,这个字符串用Internet的“.”间隔格式表示一个数字的Internet地址。返回值可用作Internet地址。所有Internet地址以网络字节顺序返回(字节从左到右排列)。
  Internet地址用“.”间隔的地址可有下列几种表达方式:
  a.b.c.d,a.b.c,a.b,a
  当四个部分都有定值时,每个都解释成一个字节数据,从左到右组成Internet四字节地址。请注意,当一个Internet地址在Intel机器上表示成一个32位整型数时,则上述的字节为“d.c.b.a”。这是因为Intel处理器的字节是从右向左排列的。
  请注意:只有Berkeley支持下述表达法,Internet其余各处均不支持。考虑到与软件的兼容性,应按规定进行使用。
  对一个三部分地址,最后一部分解释成16位数据并作为网络地址的最右两个字节。这样,三部分地址便很容易表示B组网络地址,如“128.net.host”.
  对一个两部分地址,最后一部分解释成24位数据并作为网络地址的最右三个字节,这样,两部分地址便很容易表示C组网络地址,如“net.host”。
  对仅有一个部分的地址,则将它的值直接存入网络地址不作任何字节的重组。
  返回值:
  若无错误发生,inet_addr()返回一个无符号长整型数,其中以适当字节顺序存放Internet地址。如果传入的字符串不是一个合法的Internet地址,如“a.b.c.d”地址中任一项超过255,那么inet_addr()返回INADDR_NONE。
  参见:

  inet_ntoa().

inet_addr()函数的实现

输入是点分的IP地址格式(如A.B.C.D)的字符串,从该字符串中提取出每一部分,转换为ULONG,假设得到4个ULONG型的A,B,C,D,
ulAddress(ULONG型)是转换后的结果,
ulAddress = D<<24 + C<<16 + B<<8 + A(网络字节序),即inet_addr(const char *)的返回结果
另外,我们也可以得到把该IP转换为主机序的结果,转换方法一样
A<<24 + B<<16 + C<<8 + D

 
 
inet_ntoa() 
 
简述:
 
  将网络地址转换成“.”点隔的字符串格式。
 
  #include <winsock.h>
 
  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套接口调用前复制出来。
 
  测试代码如下
 
  include <stdio.h>
 
  #include <sys/socket.h>
 
  #include <netinet/in.h>
 
  #include <arpa/inet.h>
 
  #include <string.h>
 
  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里面的可变参数的求值是从右到左的,仅此而已。
 
inet_aton()
 
inet_aton是一个改进的方法来将一个字符串IP地址转换为一个32位的网络序列IP地址。这个函数的概要如下:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char *string, struct in_addr *addr);

inet_aton函数接受两个参数。参数描述如下:

1 输入参数string包含ASCII表示的IP地址。
2 输出参数addr是将要用新的IP地址更新的结构。

如果这个函数成功,函数的返回值非零。如果输入地址不正确则会返回零。使用这个函数并没有错误码存放在errno中,所以他的值会被忽略。

对于这个函数有一点迷惑的就是这个函数调用所需要的两个参数。如果我们定义了一个AF_INET套接口地址:

struct sockaddr_in adr_inet;    /* AF_INET */

提供给inet_aton函数调用的参数指针为 &adr_inet.sin_addr

下面这个程序使用inet_aton函数,而不是我们在前面所谈到的in_addr函数。
/*
 * inetaton.c
 *
 * Example using inet_aton
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

/*
 * this function reports the error and
 * exits back to the shell
 */
static void bail(const char *on_what)
{
    fputs(on_what,stderr);
    fputs("/n",stderr);
}

int main(int argc,char **argv)
{
    int z;
    struct sockaddr_in adr_inet;    /* AF_INET */
    int len_inet;            /* length */
    int sck_inet;            /* Socket */

/* Create a Socket */
    sck_inet = socket(AF_INET,SOCK_STREAM,0);

if(sck_inet == -1)
    bail("Socket()");

/* Establish address */
    memset(&adr_inet,0,sizeof adr_inet);
    adr_inet.sin_family = AF_INET;
    adr_inet.sin_port = htons(9000);

if( !inet_aton("127.0.0.1",&adr_inet.sin_addr))
    bail("bad address");

len_inet = sizeof adr_inet;

/* Bind it to the socket */
    z = bind(sck_inet,(struct sockaddr *)&adr_inet,len_inet);

if(z == -1)
    bail("bind()");

/* Display our socket address */
    system("netstat -pa --tcp 2>/dev/null"
        " | grep inetaton");

return 0;
}
程序的运行结果如下:
S$ ./inetaton
tcp 0 0 127.0.0.23:9000 *:* CLOSE 1007/inetaton

 
http://blog.csdn.net/zhangboyj/article/details/6157263

嵌入式开发之函数解析---ip地址2进制转字符inet_ntoa 调用中只生效一次的更多相关文章

  1. (转)【ASP.NET开发】获取客户端IP地址 via C#

    [ASP.NET开发]获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己 ...

  2. 关于域名系统DNS解析IP地址的一些总结

    关于域名系统DNS(Domain Name System) 从域名中解析出IP地址. DNS主要由3部分组成: ① 名称解析器(resolver) ② 域名空间(domain name space) ...

  3. JavaMail SMTP服务器发送邮件程序示例 java通过dns服务器解析ip地址

    /** * JavaMail SMTP服务器发送邮件程序示例 * 扮演SMTP服务器角色与邮件客户端软件最大的区别就是: * SMTP服务器需要解析不同接收人邮件地址主机名对应的SMTP服务器主机名 ...

  4. 通过阿里云域名动态解析 IP 地址

    这两天在家里用树莓派折腾了一个家用服务器,主要用来做 mac 的 Time Machine ,还有就是当做下载机和 nas ,想着平时上班时间家里没人用网络,空着也是空着,就可以利用空闲带宽下个美剧啥 ...

  5. 利用mysql的inet_aton()和inet_ntoa()函数存储IP地址的方法

    原文:https://www.jb51.net/article/29962.htm 当前很多应用都适用字符串char(15)来存储IP地址(占用16个字节),利用inet_aton()和inet_nt ...

  6. DataLakeAnalytics: 解析IP地址对应的国家城市地址的能力

    Data Lake Analytics 作为云上数据处理的枢纽,最近加入了通过IP地址查找对应的国家.省份.城市.ISP的函数, 今天带大家体验一下. 函数详细介绍 本次一共添加了下面这些函数: ip ...

  7. PHP利用socket_bind函数切换IP地址采集数据

    在利用PHP进行数据采集的过程中,通常会遇到IP被屏蔽或出现验证码的情况:为了能够继续采集,我们需要切换不同的ip,每访问一次,随机切换一个IP.当然也可以通过收集大量代理,通过切换代理的方式进行采集 ...

  8. iOS开发:获取设备IP地址

    一.导入头文件 //首先导入头文件信息 #include <ifaddrs.h> #include <arpa/inet.h> #include <net/if.h> ...

  9. 使用python解析ip地址

    前言 想要批量将ip地址转换为省份城市.国家或是经纬度?百度上的批量查找每次的容量太小满足不了要求?第三方库神器 - geoip2帮你解决所有烦恼. 准备工作 首先安装一下geoip2库, pip i ...

随机推荐

  1. vue set方法

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8 ...

  2. CSU1008: Horcrux

    Description A Horcrux is an object in which a Dark wizard or witch has hidden a fragment of his or h ...

  3. 零基础入门学习Python(12)--列表:一个打了激素的数组(3)

    前言 这节课我们继续谈一下Python列表一些知识 知识点 Python常用操作符 比较操作符 >>> list1 = [123] >>> list2 = [234 ...

  4. Linux命令学习(5):more和less

    引子 平常工作中经常需要查看很大的文本文件,如果用vi打开的话会非常慢,所以平常都用less,但是并没有很系统地学习过less的用法,今天总结一下less和more的用法. 经过学习我发现less比m ...

  5. 第二十节:Scrapy爬虫框架之使用Pipeline存储

    在上两节当中,我们爬取了360图片,但是我们需要将图片下载下来,这将如何下载和存储呢? 下边叙述一下三种情况:1.将图片下载后存储到MongoDB数据库:2.将图片下载后存储在MySQL数据库:3.将 ...

  6. 指定PING的网卡

    struct ifreq ifr; // 绑定在eth0上 memset( &ifr, , sizeof( struct ifreq ) ); snprintf( ifr.ifr_name, ...

  7. 杭电 2035 (快速幂) 求A^B的最后三位数表示的整数

    Description 求A^B的最后三位数表示的整数. 说明:A^B的含义是“A的B次方”    Input 输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B&l ...

  8. Orcad中较好的习惯背景

    设置背景,能让眼睛不那么疲劳,尤其是白色背景,有的时候很耀眼,看的时间长了,眼疼. 因此萌生出更换背景的想法: Option->Preference中 第一列的Prin中"Alias& ...

  9. Java基础学习总结(89)——为什么单元测试应该我们开发人员来写

    软件测试是为了保证项目质量,单元测试可以快速执行测试回归测试,做好单元测试可以大大提升测试效率,项目开发真正达到敏捷效果. 单元测试做什么? 1. 核心类方法 2. 异常处理 3. 边界值测试 4. ...

  10. Android OkHttp(1)

     Android OkHttp(1) OkHttp是一个流行的第三方开源网络请求框架,在目前的一些APP开发中比较流行.Android平台开源的网络请求框架不少,比如常见的Volley, Asyn ...