相关函数(暂存)

24 篇文章 0 订阅
7 篇文章 0 订阅
以下所述服务既可以是十进制端口数值,也可以是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函数解决了把主机名和服务名转换成套接字地址结构的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值