linux inet_aton使用实例,C语言中实现inet_aton和inet_ntoa函数功能
下面我们来看一篇关于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 *) ∈
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函数功能相关推荐
- c语言中用于获取字符串长度的函数是,C语言中求字符串长度的函数的几种实现方法...
C语言中求字符串长度的函数的几种实现方法 1.最常用的方法是创建一个计数器,判断是否遇到'\0',不是'\0'指针就往后加一. int my_strlen(const char *str) { ass ...
- C语言中的字符串转数字函数常见问题详解
目录 C语言中的字符串转数字函数常见问题详解 字符串转整形 atoi函数 字符串转长整形 strtol函数, C语言中的字符串转数字函数常见问题详解 字符串转整形 atoi函数 函数原型: int a ...
- C语言中求字符串长度的函数my_strlen()的几种实现方法
C语言中求字符串长度的函数的几种实现方法 1.最常用的方法是创建一个计数器,判断是否遇到'\0',不是'\0'指针就往后加一. int my_strlen(const char *str) {asse ...
- c语言常用数学函数大全查询,C语言数学函数 C语言中全部可用的数学函数有哪些?...
导航:网站首页 > C语言数学函数 C语言中全部可用的数学函数有哪些? C语言数学函数 C语言中全部可用的数学函数有哪些? 相关问题: 匿名网友: /*--------------------- ...
- C 语言中获取系统时间的函数,C/C++如何获取当前系统时间的实例详解
C/C++如何获取当前系统时间的实例详解 C库中与系统时间相关的函数定义在头文件中, C++定义在头文件中. 一.time(time_t*)函数 函数定义如下: time_t time (time_t ...
- c语言中执行一次的函数once,iOS只执行一次的方法
IOS开发(64)之GCD任务最多只执行一次 1 前言 使用 dispatch_once 函数 在 APP 的生命周期内来保证你想确保每段代码只执行一次,即使它在代码的不同地方多次调用(比如单例的初始 ...
- c语言中存储字符用什么函数,那些C语言中你不知道的字符串函数(坑)
1.strcpy() 在字符串拷贝函数中,它的函数编写不难,如下 char* Strcpy(char* dest, const char* src) { assert(dest != NULL &am ...
- c语言常用字符串处理函数6,【总结】C语言中常见的字符串处理函数
------------------------------------------------------------------------------------------- C语言中没有字符 ...
- 谈谈你对c语言中数据(各种常量,变量,函数参数,字符串)的存储认识,自考《高级语言程序设计》知识点总结(二)...
2.1 C语言的数据类型 数据类型包含两方面的内容:数据的表示和对数据加工的操作.数据的全部可能表示构成数据类型的值的集合.数据全部合理的操作构成数据类型的操作集合. 在C语言中,把整型.实型和字符型 ...
- c语言中空格字符怎么表示_C语言中常用的字符串操作函数
作者:陈太浪 出处:https://home.cnblogs.com/u/TomHe789/ C语言中提供了许多的字符串操作函数,常见的字符串操作函数有以下几种: 1.求字符串长度的函数 原型函数:s ...
最新文章
- python能做什么游戏ll-Python 应该怎么学?
- mongodb @aggregation 返回字段映射不上_MongoDB---基于分布式文件存储的数据库(二)...
- japidocs怎么设置参数必填_JApiDocs 动态生成接口文档,并解析java 源码中的注释...
- 如何使用eclipse软件创建一个Java项目?
- 使用Hybris Commerce User API读取用户信息时,电话字段没有返回
- 全连接层 时间复杂度_神经网络全连接层(3)
- MySQL常见面试题与答案
- 中文语音识别系统搭建流程笔记
- css3中的transform中的3d变换:translatez()与transform-origin-z()的区别
- git-commit-amend踩坑
- Ps素描效果引用说明
- 解决方案的四种落地形态
- 新世纪五笔 形码之耻_世纪之剑
- IDEA软件常见的使用方法
- 在屏幕坐标和窗口坐标之见的转换
- 2023年华为认证HCIA云计算题库(H13-511)
- python选择文件读入_Python学习-文件的调用-读取
- Zhong__Centos配置NTP时间同步
- android手机内存越来越小,安卓手机因软件安装失败 导致手机内存越来越小解决方法...
- 树莓派开发系列教程1——树莓派介绍
热门文章
- redis 客户端 -- lettuce 介绍
- 图片文件捆绑教学(仅限制图片与rar)
- Enscape for SketchUp 室外日夜景照明设置技巧
- uni-app--微信小程序自定义tabbar
- 【思维模型】拥抱复杂性(第 1 部分)
- Obsolete特性
- 小韦系统装工行网银U盾驱动的方法
- 小米5 android 4.1.2,三星GALAXY NOTE i9220 Miui V5完美运行 Android4.1.2 华丽流畅体验
- 药到病除?功能性食品到底有没有用?关键还要看你的肠道微生物
- 中考体育项目满分标准(深圳、安徽、湖北)