嵌入式Linux网络编程之:网络基础编程
而在通常使用的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> |
函数原型 |
嵌入式Linux 网络编程 SOCKET 操作系统 相关文章:
- 嵌入式Linux技术在工业控制网络中的应用(10-30)
- 基于嵌入式Linux的组态软件实时数据库的设计(02-01)
- 基于ARM+DSP的嵌入式Linux数控系统设计(11-18)
- 基于嵌入式Linux的细胞特征提取算法设计(11-19)
- 基于S3C2410的嵌入式Linux系统构建(03-02)
- 嵌入式Linux网络编程之:实验内容——NTP协议实现(08-13)