新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 嵌入式Linux网络编程之:网络基础编程

嵌入式Linux网络编程之:网络基础编程

作者:时间:2013-09-13来源:网络收藏

本文引用地址:http://www.eepw.com.cn/article/257116.htm

表10.4列出了inet_ntop函数的语法要点。

表10.4 inet_ntop函数语法要点

所需头文件

#includearpa/inet.h>

函数原型

intinet_ntop(intfamily,void*addrptr,char*strptr,size_tlen)

函数传入值

family

AF_INET:IPv4协议

AF_INET6:IPv6协议

函数传入值

addrptr:转化后的地址

strptr:要转化的值

len:转化后值的大小

函数返回值

成功:0

出错:-1

4.名字地址转化

(1)函数说明。

通常,人们在使用过程中都不愿意记忆冗长的IP地址,尤其到IPv6时,地址长度多达128位,那时就更加不可能一次次记忆那么长的IP地址了。因此,使用主机名将会是很好的选择。在Linux中,同样有一些函数可以实现主机名和地址的转化,最为常见的有gethostbyname()、gethostbyaddr()和getaddrinfo()等,它们都可以实现IPv4和IPv6的地址和主机名之间的转化。其中gethostbyname()是将主机名转化为IP地址,gethostbyaddr()则是逆操作,是将IP地址转化为主机名,另外getaddrinfo()还能实现自动识别IPv4地址和IPv6地址。

gethostbyname()和gethostbyaddr()都涉及一个hostent的结构体,如下所示:

structhostent

{

char*h_name;/*正式主机名*/

char**h_aliases;/*主机别名*/

inth_addrtype;/*地址类型*/

inth_length;/*地址字节长度*/

char**h_addr_list;/*指向IPv4或IPv6的地址指针数组*/

}

调用gethostbyname()函数或gethostbyaddr()函数后就能返回hostent结构体的相关信息。

getaddrinfo()函数涉及一个addrinfo的结构体,如下所示:

structaddrinfo

{

intai_flags;/*AI_PASSIVE,AI_CANONNAME;*/

intai_family;/*地址族*/

intai_socktype;/*socket类型*/

intai_protocol;/*协议类型*/

size_tai_addrlen;/*地址字节长度*/

char*ai_canonname;/*主机名*/

structsockaddr*ai_addr;/*socket结构体*/

structaddrinfo*ai_next;/*下一个指针链表*/

}

hostent结构体而言,addrinfo结构体包含更多的信息。

(2)函数格式。

表10.5列出了gethostbyname()函数的语法要点。

表10.5 gethostbyname函数语法要点

所需头文件

#includenetdb.h>

函数原型

structhostent*gethostbyname(constchar*hostname)

函数传入值

hostname:主机名

函数返回值

成功:hostent类型指针

出错:-1

调用该函数时可以首先对hostent结构体中的h_addrtype和h_length进行设置,若为IPv4可设置为AF_INET和4;若为IPv6可设置为AF_INET6和16;若不设置则默认为IPv4地址类型。

表10.6列出了getaddrinfo()函数的语法要点。

表10.6 getaddrinfo()函数语法要点

所需头文件

#includenetdb.h>

函数原型

intgetaddrinfo(constchar*node,constchar*service,conststructaddrinfo*hints,structaddrinfo**result)

函数传入值

node:网络地址或者网络主机名

service:服务名或十进制的端口号字符串

hints:服务线索

result:返回结果

函数返回值

成功:0

出错:-1

在调用之前,首先要对hints服务线索进行设置。它是一个addrinfo结构体,表10.7列举了该结构体常见的选项值。

表10.7 addrinfo结构体常见选项值

结构体头文件

#includenetdb.h>

ai_flags

AI_PASSIVE:该套接口是用作被动地打开

AI_CANONNAME:通知getaddrinfo函数返回主机的名字

ai_family

AF_INET:IPv4协议

AF_INET6:IPv6协议

AF_UNSPEC:IPv4或IPv6均可

ai_socktype

SOCK_STREAM:字节流套接字socket(TCP)

SOCK_DGRAM:数据报套接字socket(UDP)

ai_protocol

IPPROTO_IP:IP协议

IPPROTO_IPV4:IPv4协议

4

IPv4

IPPROTO_IPV6:IPv6协议

IPPROTO_UDP:UDP

IPPROTO_TCP:TCP

注意

(1)通常服务器端在调用getaddrinfo()之前,ai_flags设置AI_PASSIVE,用于bind()函数(用于端口和地址的绑定,后面会讲到),主机名nodename通常会设置为NULL。

(2)客户端调用getaddrinfo()时,ai_flags一般不设置AI_PASSIVE,但是主机名nodename和服务名servname(端口)则应该不为空。

(3)即使不设置ai_flags为AI_PASSIVE,取出的地址也可以被绑定,很多程序中ai_flags直接设置为0,即3个标志位都不设置,这种情况下只要hostname和servname设置的没有问题就可以正确绑定。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

linux相关文章:linux教程




评论


相关推荐

技术专区

关闭