设为首页 加入收藏

TOP

Linux网络编程中的地址问题
2014-11-24 12:02:50 来源: 作者: 【 】 浏览:0
Tags:Linux 网络编程 地址 问题

平时我们使用的IP地址是192.168.1.11这种类型的字符串;而在Linux内核中是用二进制方式表达的IP地址。在程序设计中经常要用到字符串表达方式的IP地址和二进制的IP地址之间的转换.


面对网络编程中众多的地址函数,你hold住了么,tiger哥没hold住,所以就写了此篇文章,希望大家能hold住网络编程


前言:结构体struct in_addr


结构struct in_addr 在文件中定义,结构in_addr 有一个unsigned long int 类型的成员变量s_addr。通常所说的IP地址的二进制形式就保存在成员变量s_addr中。


结构struct in_addr的原型如下:


structin_addr{


unsigned long int s_addr;/*IP地址*/


}


一.字符串IP地址转换为二进制形式的IP地址函数



1.inet系列函数的原型:


#include


#include


#include


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


int addr_t inet_addr(const char *cp);


int 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);


2.inet_aton()函数


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


1>函数作用:inet_ation()函数将在cp中存储的点分十进制字符串类型的IP地址,转换为二进制的IP地址,转换后的值保存在指针inp指向的结构struct in_addr中。


2>形参


const char *cp:指向字符类型的IP地址。例如“192.168.1.11”


struct in_addr *inp:指向二进制的网络字节顺序的IP地址


structin_addr{


unsignedlong s_addr


}


3>函数执行成功则返回非0值,参数无效则返回0。


4>实例:


#include


#include


#include



#include


#include


#include


int main()


{


char buffer[32];


structin_addr in;


in.s_addr =0;


/*输入一个字符串形式的IP地址*/


printf(“pleaseinput the ip addrss\n”);


scanf(“%s”,buffer);


buffer[31]=’\0’;


printf(“original IP地址:%s\n”,buffer);


if( 0 == inet_aton(buffer,&in)){


perror(“inet_aton”);


exit(1);


} else {


printf(“after transfer:0x%0x\n”,in.s_addr);


}


}


5> inet_aton函数最后计算出来的是网络字节序的二进制IP


3.inet_addr()函数


in_addr_t inet_addr(const char *cp)


1>函数作用:


它将参数cp所指向的字符串形式的IP地址(“192.168.1.11”)转换为二进制的网络字节序的IP地址形式


该函数的缺点是:如果IP地址是255.255.255.255。那么调用inet_addr()函数后将返回-1(因为-1的补码形式是0xFFFFFFFF)。所以不建议使用inet_addr()函数,而是使用inet_aton()函数。


2>函数形参:


const char*cp:cp指向字符串形式的IP地址。


3>函数返回值:


函数成功后返回二进制的网络字节序的IP地址(struct in_add),否则返回-1.


4>inet_addr计算出来的是网络字节序的二进制IP


5>函数实例:


#include


#include


#include



#include


#include


#include


int main()


{


char buffer[32];


structin_addr in;


in.s_addr =0;


/*输入一个字符串形式的IP地址*/


printf(“pleaseinput the ip addrss\n”);


scanf(“%s”,buffer);


buffer[31]=’\0’;


printf(“original IPaddress:%s\n”,buffer);


if((in.s_addr = inet_addr(buffer))==INADDR_NONE){


perror(“inet_addr”);


exit(1);


} else {


printf(“after transfer:0x%0x\n”,in.s_addr);


}


}


4.inet_network


in_addr_t inet_network(constchar *cp)


1>函数作用:将参数cp指向的字符串形式的网络地址转换为主机字节顺序形式的二进制IP地址。


2>函数形参


const char *cp: cp指向字符串形式的IP地址。


3>函数返回值:执行成功后返回转换后的结果,参数无效后返回-1.


4>inet_network返回的是主机字节序


5>函数实例:


#include


#include


#include



#include


#include


#include


int main()


{


char buffer[32];


structin_addr in;


in.s_addr =0;


/*输入一个字符串形式的IP地址*/


printf(“pleaseinput the ip addrss\n”);


scanf(“%s”,buffer);


buffer[31]=’\0’;


printf(“original IPaddress:%s\n”,buffer);


if((in.s_addr = inet_addr(buffer))==INADDR_NONE){


perror(“inet_addr”);


exit(1);


} else {


printf(“after transfer:0x%0x\n”,in.s_addr);


}


}


总结:


1.inet_addr和inet_network函数都是用于将字符串形式转换为整数形式用的;


2.inet_addr返回的整数形式是网络字节序,而inet_network返回的整数形式是主机字节序.


3.inet_addr 和inet_network有一个小缺陷,那就是当IP是255.255.255.255时,这两个函数会认为这是个无效的IP地址,这是历史遗留问题,其实在目前大部分的路由器上,这个 255.255.255.255的IP都是有效的。


4.inet_aton认为255.255.255.255是有效的,所以建议使用inet_aton。并且inet_aton函数返回的是网络字节序的IP地址。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇基于Linux的多播编程 下一篇基于Linux下的UDP编程

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Libevent C++ 高并发 (2025-12-26 00:49:30)
·C++ dll 设计接口时 (2025-12-26 00:49:28)
·透彻理解 C 语言指针 (2025-12-26 00:22:52)
·C语言指针详解 (经典 (2025-12-26 00:22:49)
·C 指针 | 菜鸟教程 (2025-12-26 00:22:46)