前言
在这篇博客文章中,我们将深入探讨一些关键的网络编程接口和函数,这些功能在处理网络应用程序和服务时至关重要。我们将重点介绍几个标准的网络编程接口,如 `gethostent`、`getprotobyname`、`getservbyname`、`getaddrinfo` 和 `getnameinfo`,这些都是 Unix 和类 Unix 系统下网络编程的基础。这些函数使开发者能够查询和操作网络地址、主机信息、服务和协议等。
我们会详细讨论每个函数的作用、返回值、结构定义以及它们如何在实际编程中应用。通过对这些函数的了解和使用,您将能够更有效地开发和维护网络应用程序,处理与网络相关的各种任务。
这篇文章对于想要深入了解网络编程的新手开发者或是需要回顾和加深理解的资深开发者都非常有用。让我们开始吧,探索这些强大的网络编程工具,它们是现代互联网应用不可或缺的一部分。
函数原型
- 找到给定计算机的主机信息。
struct hostent *gethostent(void); //成功则返回指针,出错则返回N ULL。
// 如果主机数据文件没有打开,gethostent会打开它。 返回值: 若 成功 ,返回 指针 若 失败 ,返回 NULL; void sethostent(int stayopen); // 函数gethostent返回文件的下一个条目。函数sethostent会打开文件, void endhostent(void); // 如果文件已经被打开,那么将其回绕。函数endhostent将关闭文件。 当gethostent返回时,得到一个指向hostent结构的指针,该结构可能包含一个静态的数据缓冲区。 每次调用gethostent将 会覆盖这个缓冲区。 hostent至少包含如下成员: struct hostent { char *h_name; //name of host char **h_aliases; //pointer to alernate host name array int h_addrtype; //address type int h_length; //length in bytes of address char **h_addr_list; //pointer to array of network addresses ..... }; • 可以将协议名称和协议号采用如下函数映射。 struct protoent *getprotobyname(const char *name); // 如果主机数据文件没有打开,gethostent会打开它。 struct protoent *getprotobynumber(int proto); // 如果主机数据文件没有打开,gethostent会打开它。 struct protoent *getprotoent(void); // 如果主机数据文件没有打开,gethostent会打开它。 POSIX.1定义的结构protoent至少包含如下成员: struct protoent { char *p_name; //protocol name char **p_aliases; //pointer to alternate protocol name array int p_proto; //protocol number ...... }; 返回值: 若 成功 ,返回 指针 若 失败 ,返回 NULL; • 可以将协议名称和协议号采用如下函数映射。 struct servent *getservbyname(const char *name, const char *proto); //可以将一个服务 名字映射到一个端口号 struct servent *getservbyport(int port, const char *proto); // 将一个端口号映射到一个服务名 struct servent *getservent(void); // 顺序扫描服务数据库。 返回值: 若 成功 ,返回 指针 若 失败 ,返回 NULL; void setservent(int stayopen); void endservent(void); 结构servent至少包含如下成员: struct servent{ char *s_name; //service name char **s_aliases; //pointer to alternate service name array int s_port; //port number char *s_proto; //name of protocol ...... }; • 将一个主机名字和服务名字映射到一个地址 int getaddrinfo(const char *restrict host, const char *restrict service, c onst struct addrinfo *restrict hint, struct addrinfo **restrict res); // 允许将一个主机名字和服务名字映射到一个地址。 返回值: 若 成功 ,返回 0 若 失败 ,返回 非0错误码, 如果getaddrinfo失败,不能使用perror或strerror来生成错误消息,替代使用gai_strerror将返回的错误代码转换成错误消息 。 #include const char *gai_strerror(int error); //指向描述错误的字符串的指针 函数getaddrinfo返回一个结构addrinfo的链表。可以用freeaddrinfo来释放一个或多个这种结构。 结构addrinfo的定义至少包含如下成员: struct addrinfo{ int ai_flags; //customize behavior int ai_family; //address family int ai_socktype; //socket type int ai_protocol; //protocol socklen_t ai_addrlen; //length int bytes of address struct sockaddr *ai_addr; //address char *ai_canonname; //canonical name of host struct addrinfo *ai_next; //next in list ...... }; void freeaddrinfo(struct addrinfo *ai); // 释放一个或多个 getaddrinfo返回的addrinfo 结构 的链表 。 需要提供主机名字、服务名字或者两者都提供。 如果仅仅提供一个名字,另外一个必须是一个空指针。 主机名可以是一个节点名或点分十进制记法表示的主机地址。 • 将地址转换成主机名或者服务名。 int getnameinfo(const struct sockaddr *restrict addr, socklen_t alen, char *restrict host, socklen_t hostlen, char *restrict service, socklen_t servlen, unsigned int flags); //addr被转换成主机名或者服务名,
如果host非空,它指向一个长度为hostlen字节的缓冲区用于存储返回的主机名。
同样, 如果service非空,它指向一个长度为servlen字节缓冲区用于存储返回的服务名。
参数flags指定一些转换的控制方式,具体如下表:
返回值:
若 成功 ,返回 0
若 失败 ,返回 非0错误码,