微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式Linux网络编程之:网络基础编程

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

时间:08-13 来源:3721RD 点击:

而在通常使用的socket编程中所使用的则是二进制值,这就需要将这两个数值进行转换。这里在IPv4中用到的函数有inet_aton()、inet_addr()和inet_ntoa(),而IPv4和IPv6兼容的函数有inet_pton()和inet_ntop()。由于IPv6是下一代互联网的标准协议,因此,本书讲解的函数都能够同时兼容IPv4和IPv6,但在具体举例时仍以IPv4为例。

这里inet_pton()函数是将点分十进制地址映射为二进制地址,而inet_ntop()是将二进制地址映射为点分十进制地址。

(2)函数格式。

表10.3列出了inet_pton函数的语法要点。

表10.3 inet_pton函数语法要点

所需头文件

#include <arpa/inet.h>

函数原型

int inet_pton(int family, const char *strptr, void *addrptr)

函数传入值

family

AF_INET:IPv4协议

AF_INET6:IPv6协议

strptr:要转化的值

addrptr:转化后的地址

函数返回值

成功:0

出错:-1

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

表10.4 inet_ntop函数语法要点

所需头文件

#include <arpa/inet.h>

函数原型

int inet_ntop(int family, void *addrptr, char *strptr, size_t len)

函数传入值

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的结构体,如下所示:

struct hostent

{

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

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

int h_addrtype;/*地址类型*/

int h_length;/*地址字节长度*/

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

}

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

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

struct addrinfo

{

int ai_flags;/*AI_PASSIVE, AI_CANONNAME;*/

int ai_family;/*地址族*/

int ai_socktype;/*socket类型*/

int ai_protocol;/*协议类型*/

size_t ai_addrlen;/*地址字节长度*/

char *ai_canonname;/*主机名*/

struct sockaddr *ai_addr;/*socket结构体*/

struct addrinfo *ai_next;/*下一个指针链表*/

}

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

(2)函数格式。

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

表10.5 gethostbyname函数语法要点

所需头文件

#include <netdb.h>

函数原型

struct hostent *gethostbyname(const char *hostname)

函数传入值

hostname:主机名

函数返回值

成功:hostent类型指针

出错:-1

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

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

表10.6 getaddrinfo()函数语法要点

所需头文件

#include <netdb.h>

函数原型

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top