以下所述服务既可以是十进制端口数值,也可以是ftp,http,domain等。因为不同特定服务对应不同的端口。
gethostbyname函数通过查询DNS服务器用主机名来获得主机IPv4地址。
#include <netdb.h>
struct hostent *gethostbyname(const char *hostname);
struct hostent{
char *h_name; /*official name of host*/
char **h_aliases; /*pointer to array of pointers to alias names*/
int h_addrtype; /*host address type: AF_INET*/
int h_length; /*length of address: 4*/
char **h_addr_list; /*ptr to array of ptrs with IPv4 addrs*/
};
其返回值设置全局变量h_errno值:
HOST_NOT_FOUND, TRY_AGAIN, NO_RECOVERY,NO_DATA(主机名有效,但是没有A记录,即没有将主机映射为IPv4地址的记录)
gethostbyaddr将IP地址映射为主机名。
struct hostent *gethostbyaddr(const char *addr, socklen_t len, int family);
addr实际为in_addr结构,内部成员为in_addr_t s_addr,in_addr_t为32位无符号整数。
通过名字来获得服务名,即端口号。
#include <netdb.h>
sruct servent *getservbyname(const char *servname, const char *protoname);
struct servent{
char *s_name; /*official service name*/
char **s_aliases; /*alias list*/
int s_port; /*port number, network byte order*/
char *s_proto; /*protocol to use*/
};
典型调用如下:
struct servent *sptr;
sptr = getservbyname("domain", "dup");
sptr = getservbyname("ftp", "tcp");
sptr = getservbyname("ftp", NULL); /*ftp using TCP*/
getservbyport根据给定端口号和可选协议查找相应服务。
struct servent *getservbyport(int port, const char *protoname);
port为网络字节序,典型调用如下:
struct servent *sptr;
sptr = getservbyport(htons(21), "tcp"); /*ftp using tcp*/
sptr = getservbyport(htons(53), "udp"); /*DNS using UDP*/
gethostbyname和gethostbyaddr仅仅支持IPv4.
getaddrinfo能够处理名字到地址以及服务到端口这两种转换。
#include <netdb.h>
int getaddrinfo(const char *hostname, const char *service,
const struct addrinfo *hints, struct addrinfo **result);
struct addrinfo{
int ai_flags;
int ai_family; /*AF_xxx*/
int ai_socktype; /*SOCK_xxx*/
int ai_protocol; /*0 or IPPROTO_xxx for IPv4 and IPv6 */
socklen_t ai_addrlen; /*length of ai_addr*/
char *ai_annonname; /*ptr to canonial name for host*/
struct sockaddr *ai_addr; /*ptr to socket address structure*/
struct addrinfo *ai_next; /*ptr ro next structure in linked list*/
};
hostname是一个主机名或地址串(IPv4点分十进制或IPv6的十六进制数串)。service是一个服务名或十进制端口号数串。hints可以为NULL或struct
addrinfo类型的指针。调用者可以通过填写hints结构中的成员来获得返回暗示。返回值实例可参见图x。
hints中可设置的成员有:
ai_flags(0个或多个或在一起的AI_xxx);
ai_family(某个AF_xxx值);
ai_socktype(某个SOCK_xxx值);
ai_protocol。
getaddrinfo函数解决了把主机名和服务名转换成套接字地址结构的问题。
gethostbyname函数通过查询DNS服务器用主机名来获得主机IPv4地址。
#include <netdb.h>
struct hostent *gethostbyname(const char *hostname);
struct hostent{
char *h_name; /*official name of host*/
char **h_aliases; /*pointer to array of pointers to alias names*/
int h_addrtype; /*host address type: AF_INET*/
int h_length; /*length of address: 4*/
char **h_addr_list; /*ptr to array of ptrs with IPv4 addrs*/
};
其返回值设置全局变量h_errno值:
HOST_NOT_FOUND, TRY_AGAIN, NO_RECOVERY,NO_DATA(主机名有效,但是没有A记录,即没有将主机映射为IPv4地址的记录)
gethostbyaddr将IP地址映射为主机名。
struct hostent *gethostbyaddr(const char *addr, socklen_t len, int family);
addr实际为in_addr结构,内部成员为in_addr_t s_addr,in_addr_t为32位无符号整数。
通过名字来获得服务名,即端口号。
#include <netdb.h>
sruct servent *getservbyname(const char *servname, const char *protoname);
struct servent{
char *s_name; /*official service name*/
char **s_aliases; /*alias list*/
int s_port; /*port number, network byte order*/
char *s_proto; /*protocol to use*/
};
典型调用如下:
struct servent *sptr;
sptr = getservbyname("domain", "dup");
sptr = getservbyname("ftp", "tcp");
sptr = getservbyname("ftp", NULL); /*ftp using TCP*/
getservbyport根据给定端口号和可选协议查找相应服务。
struct servent *getservbyport(int port, const char *protoname);
port为网络字节序,典型调用如下:
struct servent *sptr;
sptr = getservbyport(htons(21), "tcp"); /*ftp using tcp*/
sptr = getservbyport(htons(53), "udp"); /*DNS using UDP*/
gethostbyname和gethostbyaddr仅仅支持IPv4.
getaddrinfo能够处理名字到地址以及服务到端口这两种转换。
#include <netdb.h>
int getaddrinfo(const char *hostname, const char *service,
const struct addrinfo *hints, struct addrinfo **result);
struct addrinfo{
int ai_flags;
int ai_family; /*AF_xxx*/
int ai_socktype; /*SOCK_xxx*/
int ai_protocol; /*0 or IPPROTO_xxx for IPv4 and IPv6 */
socklen_t ai_addrlen; /*length of ai_addr*/
char *ai_annonname; /*ptr to canonial name for host*/
struct sockaddr *ai_addr; /*ptr to socket address structure*/
struct addrinfo *ai_next; /*ptr ro next structure in linked list*/
};
hostname是一个主机名或地址串(IPv4点分十进制或IPv6的十六进制数串)。service是一个服务名或十进制端口号数串。hints可以为NULL或struct
addrinfo类型的指针。调用者可以通过填写hints结构中的成员来获得返回暗示。返回值实例可参见图x。
hints中可设置的成员有:
ai_flags(0个或多个或在一起的AI_xxx);
ai_family(某个AF_xxx值);
ai_socktype(某个SOCK_xxx值);
ai_protocol。
getaddrinfo函数解决了把主机名和服务名转换成套接字地址结构的问题。