coming
天行健 君子以自强不息
记录我的成长
域名解析
Linux提供gethostbyname函数对域名进行解析。
1 2 3 4 5 6
|
struct hostent * gethostbyname(const char * doname);
|
其中,结构体hostent定义如下。
如果想通过IP地址查到主机信息,使用gethostbyaddr函数。
1 2 3 4 5 6 7 8
|
struct hostent * gethostbyaddr(const void * addr, size_t len, int type);
|
上述两个函数不可重入。
服务解析
getservbyname函数根据服务名称获取某个服务的完整信息。
1 2 3 4 5 6 7
|
struct servent * getservbyname(const char * name, const char * proto);
|
其中,结构体servent的定义如下。
1 2 3 4 5 6 7 8 9 10 11 12 13
|
struct servent{ char *s_name; char **s_aliases; int s_port; char *s_proto; };
|
也可以通过端口获得服务的完整信息,使用getservbyport函数。
1 2 3 4 5 6
|
struct servent * getservbyport(int port, const char * proto);
|
上述两个函数不可重入。Linux提供了这些函数可重入版本,在函数名尾部加上_r;
getaddrinfo
getaddrinfo函数既能通过主机名获得IP地址,也能通过服务名获得端口号。
1 2 3 4 5 6 7 8 9
|
int getaddrinfo(const char * name, const char * service, const struct addrinfo * hints, struct addrinfo * * result);
|
其中,结构体addrinfo的定义如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
struct addrinfo{ int ai_flags; int ai_family; int ai_socktype; int ai_protocol; socklen_t ai_addrlen; struct sockaddr *ai_addr; char *ai_canonname; struct addrinfo *ai_next; };
|
getaddrinfo将隐式分配堆内存,使用配对函数freeaddrinfo来释放这段内存。
1 2 3 4
|
void freeaddrinfo(struct addrinfo * result);
|
getnameinfo
getnameinfo能通过socket地址同时获得以字符串表示的主机名与服务名。
1 2 3 4 5 6 7 8 9 10
|
int getnameinfo(const struct sockadrr * addr, socklen_t addrlen, char * host, socklen_t hostlen, char * serv, socklen_t servlen, int flags);
|
本文代表个人观点,内容仅供参考。若有不恰当之处,望不吝赐教!