网络信息API

获取主机信息的函数

函数介绍

gethostbyname函数根据主机名获取主机的完整信息。它通常是先在本地的/etc/hosts配置文件中查找主机,没有找到,再去访问DNS服务器。gethostbyaddr函数根据主机地址获取主机的完整信息。

1
2
3
#include <netdb.h>
struct hostent * gethostbyname(const char * name);
struct hostent * gethostbyaddr(const void * addr, size_t len, int type);

参数介绍

name参数指定目标主机的主机名。

addr参数指定目标主机的IP地址,len参数与指定addr所指的IP地址长度,type参数指定addr所指IP地址的类型,其合法取值包括:AF_INET和AF_INET6。

返回值

两个函数的返回值都是hostent结构体类型的指针,hostent结构体的定义如下:

1
2
3
4
5
6
7
8
9
#include <netdb.h>
sturct hostent
{
char * h_name; /* 主机名 */
char ** h_aliases; /* 主机别名列表, */
int h_addrtype; /* 地址类型 */
int h_length; /* 地址长度 */
char ** h_addr_list; /* 按网络字节序列出的主机IP地址列表 */
}

获取某个服务的信息

函数介绍

getservbyname函数根据名称来获取某个服务的完整信息,getservbyport函数根据端口号获取某个服务的完整信息。它们实际上都是通过读取/etc/services文件来获取服务的信息的。

1
2
3
4
#include <netdb.h>

struct servent * getservbyname(const char *name,const char * proto);
struct servent * getservbyport(int port, const char * proto);

参数介绍

name参数指定目标服务的名字。

port参数指定目标服务对应的端口号。proto参数指定服务类型,给它传递“tcp”表示获取流服务,给它传递“udp”表示获取数据报服务,给它传递NULL则表示获取所有类型的服务。

函数返回值

这两个函数都是返回servent结构体类型指针,servent结构体定义如下:

1
2
3
4
5
6
7
struct servent
{
char * s_name; /* 服务名称 */
char ** s_aliases; /* 服务别名 */
int s_port; /* 端口号 */
char * s_proto; /* 服务类型,通常是tcp或udp */
}

总结

上面的这个四个函数都是不可重入的,也就是非线程安全的。不过netdb.h头文件给出它们的可重入版本。只需要在这些函数的原函数名尾部加上_r。例如:

1
gethostbyname_r