下面我们来看一篇关于C语言中实现inet_aton和inet_ntoa函数功能的例子,希望这篇文章能够对各位带来帮助,具体的如下所示。

之前遇到过要自己实现inet_aton和inet_ntoa函数功能的问题,这里总结一下。

1 基本知识

网络字节序是大端模式,那么内存中的低地址存放的是数据的高位,内存中的高地址存放的是数据的低位。 inet_aton是将IPv4地址(点分法)转换成对应的十进制整数;而inet_ntoa是将十进制整数转换成对应的IPv4地址(点分法)。

2 完整代码

#include

#include

#include "print.h"

#define IP_ADRESS "192.168.1.177"

/*

* 将IPv4地址(点分法)转换成对应的十进制整数

* 原函数声明:

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

*/

unsigned int __inet_aton( const char *c_ipaddr )

{

unsigned int u_ipaddr = 0;

unsigned int u_tmp = 0;

char c;

int i_base = 10;

int i_shift = 0;

int i_recycle = 0;

c = *c_ipaddr;

while( 1 )

{

u_tmp = 0;

while( 1 )

{

//如果是数字

if( isdigit(c) )

{

u_tmp = (u_tmp * i_base) (c - 0x30);

c = * c_ipaddr;

}

else

{

//如果不是数字而是.符号,说明.符号前面的数据已经处理完毕

break;

}

}

//字节移位,注意网络字节序是大端模式

i_shift = 8*i_recycle ;

u_tmp <<= i_shift;

u_ipaddr = u_tmp;

//对点(.)符号的处理

if( c == '.' )

{

c = * c_ipaddr;

}

else

{

//如果是其它符号(例如结束符\0等)则跳出整个循环

break;

}

}

//检查是否包含非结束符、空格等符号,是则返回0

if( c != '\0' && ( !isspace(c) ) )

goto ret_0;

return u_ipaddr;

ret_0:

return (0);

}

/**

* 将十进制整数转换成对应的IPv4地址(点分法),其中由于网络字节序是大端表示,所以第一个字节对应的是整数的低位byte[0]

* 原函数声明:

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

*/

static char buffer[16];

char *  __inet_ntoa( unsigned int in )

{

unsigned char *bytes = (unsigned char *) &in;

snprintf( buffer, sizeof (buffer), "%d.%d.%d.%d", bytes[0], bytes[1], bytes[2], bytes[3] );

return buffer;

}

int main( int argc, char **argv )

{

PRINT( "IP_ADRESS[%s] ==> [%lu].", IP_ADRESS, __inet_aton( IP_ADRESS ) );

PRINT( "[%lu]=[0x%x].", __inet_aton( IP_ADRESS ), __inet_aton( IP_ADRESS ) );

PRINT( "Network orders[%lu] ==> [%s].", __inet_aton( IP_ADRESS ), __inet_ntoa(__inet_aton( IP_ADRESS )) );

return 0;

}

3 编译执行

使用《Linux C/C 工程中可生成ELF、动/静态库文件的通用Makefile》一文中的Makefile文件进行程序编译(当然也可以使用命令进行编译gcc network_selfdefine.c -o network_selfdefine),接着执行该程序,得到如下图所示的结果:

自己实现inet_aton和inet_ntoa函数功能

需要说明的是从第87行输出的[2969675968]=[0xb101a8c0].可以看出,低字节的0xC0(即192)由于网络字节序大端模式的关系存放在内存中的高位,高字节的0xB1(即177)存放在内存中的低位。

4 附录

关于inet_aton的man说明:

[vfhky@typecodes xlei]$ man inet_aton

INET(3)                         Linux Programmer's Manual                        INET(3)

NAME

inet_aton,   inet_addr,   inet_network,   inet_ntoa,  inet_makeaddr,  inet_lnaof,

inet_netof - Internet address manipulation routines

SYNOPSIS

#include

#include

#include

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

in_addr_t inet_addr(const char *cp);

in_addr_t inet_network(const char *cp);

char *inet_ntoa(struct in_addr in);

struct in_addr inet_makeaddr(int net, int host);

in_addr_t inet_lnaof(struct in_addr in);

in_addr_t inet_netof(struct in_addr in);

Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

inet_aton(), inet_ntoa(): _BSD_SOURCE || _SVID_SOURCE

DESCRIPTION

inet_aton() converts the Internet host address cp from the IPv4  numbers-and-dots

notation  into binary form (in network byte order) and stores it in the structure

that inp points to.  inet_aton() returns nonzero if the address is valid, zero if

not.

关于inet_aton的man说明:

[vfhky@typecodes ~]$ man inet_ntoa

INET(3)                         Linux Programmer's Manual                        INET(3)

NAME

inet_aton,   inet_addr,   inet_network,   inet_ntoa,  inet_makeaddr,  inet_lnaof,

inet_netof - Internet address manipulation routines

SYNOPSIS

#include

#include

#include

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

in_addr_t inet_addr(const char *cp);

in_addr_t inet_network(const char *cp);

char *inet_ntoa(struct in_addr in);

struct in_addr inet_makeaddr(int net, int host);

in_addr_t inet_lnaof(struct in_addr in);

in_addr_t inet_netof(struct in_addr in);

Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

inet_aton(), inet_ntoa(): _BSD_SOURCE || _SVID_SOURCE

DESCRIPTION

inet_aton() converts the Internet host address cp from the IPv4  numbers-and-dots

notation  into binary form (in network byte order) and stores it in the structure

that inp points to.  inet_aton() returns nonzero if the address is valid, zero if

not.

linux inet_aton使用实例,C语言中实现inet_aton和inet_ntoa函数功能相关推荐

  1. c语言中用于获取字符串长度的函数是,C语言中求字符串长度的函数的几种实现方法...

    C语言中求字符串长度的函数的几种实现方法 1.最常用的方法是创建一个计数器,判断是否遇到'\0',不是'\0'指针就往后加一. int my_strlen(const char *str) { ass ...

  2. C语言中的字符串转数字函数常见问题详解

    目录 C语言中的字符串转数字函数常见问题详解 字符串转整形 atoi函数 字符串转长整形 strtol函数, C语言中的字符串转数字函数常见问题详解 字符串转整形 atoi函数 函数原型: int a ...

  3. C语言中求字符串长度的函数my_strlen()的几种实现方法

    C语言中求字符串长度的函数的几种实现方法 1.最常用的方法是创建一个计数器,判断是否遇到'\0',不是'\0'指针就往后加一. int my_strlen(const char *str) {asse ...

  4. c语言常用数学函数大全查询,C语言数学函数 C语言中全部可用的数学函数有哪些?...

    导航:网站首页 > C语言数学函数 C语言中全部可用的数学函数有哪些? C语言数学函数 C语言中全部可用的数学函数有哪些? 相关问题: 匿名网友: /*--------------------- ...

  5. C 语言中获取系统时间的函数,C/C++如何获取当前系统时间的实例详解

    C/C++如何获取当前系统时间的实例详解 C库中与系统时间相关的函数定义在头文件中, C++定义在头文件中. 一.time(time_t*)函数 函数定义如下: time_t time (time_t ...

  6. c语言中执行一次的函数once,iOS只执行一次的方法

    IOS开发(64)之GCD任务最多只执行一次 1 前言 使用 dispatch_once 函数 在 APP 的生命周期内来保证你想确保每段代码只执行一次,即使它在代码的不同地方多次调用(比如单例的初始 ...

  7. c语言中存储字符用什么函数,那些C语言中你不知道的字符串函数(坑)

    1.strcpy() 在字符串拷贝函数中,它的函数编写不难,如下 char* Strcpy(char* dest, const char* src) { assert(dest != NULL &am ...

  8. c语言常用字符串处理函数6,【总结】C语言中常见的字符串处理函数

    ------------------------------------------------------------------------------------------- C语言中没有字符 ...

  9. 谈谈你对c语言中数据(各种常量,变量,函数参数,字符串)的存储认识,自考《高级语言程序设计》知识点总结(二)...

    2.1 C语言的数据类型 数据类型包含两方面的内容:数据的表示和对数据加工的操作.数据的全部可能表示构成数据类型的值的集合.数据全部合理的操作构成数据类型的操作集合. 在C语言中,把整型.实型和字符型 ...

  10. c语言中空格字符怎么表示_C语言中常用的字符串操作函数

    作者:陈太浪 出处:https://home.cnblogs.com/u/TomHe789/ C语言中提供了许多的字符串操作函数,常见的字符串操作函数有以下几种: 1.求字符串长度的函数 原型函数:s ...

最新文章

  1. python能做什么游戏ll-Python 应该怎么学?
  2. mongodb @aggregation 返回字段映射不上_MongoDB---基于分布式文件存储的数据库(二)...
  3. japidocs怎么设置参数必填_JApiDocs 动态生成接口文档,并解析java 源码中的注释...
  4. 如何使用eclipse软件创建一个Java项目?
  5. 使用Hybris Commerce User API读取用户信息时,电话字段没有返回
  6. 全连接层 时间复杂度_神经网络全连接层(3)
  7. MySQL常见面试题与答案
  8. 中文语音识别系统搭建流程笔记
  9. css3中的transform中的3d变换:translatez()与transform-origin-z()的区别
  10. git-commit-amend踩坑
  11. Ps素描效果引用说明
  12. 解决方案的四种落地形态
  13. 新世纪五笔 形码之耻_世纪之剑
  14. IDEA软件常见的使用方法
  15. 在屏幕坐标和窗口坐标之见的转换
  16. 2023年华为认证HCIA云计算题库(H13-511)
  17. python选择文件读入_Python学习-文件的调用-读取
  18. Zhong__Centos配置NTP时间同步
  19. android手机内存越来越小,安卓手机因软件安装失败 导致手机内存越来越小解决方法...
  20. 树莓派开发系列教程1——树莓派介绍

热门文章

  1. redis 客户端 -- lettuce 介绍
  2. 图片文件捆绑教学(仅限制图片与rar)
  3. Enscape for SketchUp 室外日夜景照明设置技巧
  4. uni-app--微信小程序自定义tabbar
  5. 【思维模型】拥抱复杂性(第 1 部分)
  6. Obsolete特性
  7. 小韦系统装工行网银U盾驱动的方法
  8. 小米5 android 4.1.2,三星GALAXY NOTE i9220 Miui V5完美运行 Android4.1.2 华丽流畅体验
  9. 药到病除?功能性食品到底有没有用?关键还要看你的肠道微生物
  10. 中考体育项目满分标准(深圳、安徽、湖北)