深入理解 Linux 系统下的关键网络接口和函数,gethostent,getaddrinfo,getnameinfo

简介: 深入理解 Linux 系统下的关键网络接口和函数,gethostent,getaddrinfo,getnameinfo

前言

在这篇博客文章中,我们将深入探讨一些关键的网络编程接口和函数,这些功能在处理网络应用程序和服务时至关重要。我们将重点介绍几个标准的网络编程接口,如 `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错误码,

 

目录
相关文章
|
1天前
|
机器学习/深度学习 算法 计算机视觉
m基于Yolov2深度学习网络的人体喝水行为视频检测系统matlab仿真,带GUI界面
MATLAB 2022a中使用YOLOv2算法对avi视频进行人体喝水行为检测,结果显示成功检测到目标。该算法基于全卷积网络,通过特征提取、锚框和损失函数优化实现。程序首先打乱并分割数据集,利用预训练的ResNet-50和YOLOv2网络结构进行训练,最后保存模型。
12 5
|
2天前
|
Ubuntu Linux
Linux(Ubuntu)系统临时IP以及静态IP配置(关闭、启动网卡等操作)
请注意,以上步骤是在临时基础上进行配置的。如果要永久保存静态IP地址,通常还需要修改 `/etc/network/interfaces`文件,以便在系统重启后保持配置。同时,确保备份相关配置文件以防止出现问题。
13 1
|
3天前
|
Linux 数据安全/隐私保护
Linux系统忘记密码的三种解决办法
这篇博客介绍了三种在Linux忘记密码时重置登录密码的方法:1) 使用恢复模式,通过控制台界面以管理员权限更改密码;2) 利用Linux Live CD/USB启动,挂载硬盘分区并使用终端更改密码;3) 进入单用户模式,自动以管理员身份登录后重置密码。每个方法都提供了详细步骤,提醒用户在操作前备份重要数据。
|
3天前
|
JSON Unix Linux
Linux系统之jq工具的基本使用
Linux系统之jq工具的基本使用
32 2
|
3天前
|
数据采集 监控 安全
linux系统被×××后处理经历
linux系统被×××后处理经历
|
3天前
|
监控 安全 Linux
Linux系统之安装ServerBee服务器监控工具
【4月更文挑战第22天】Linux系统之安装ServerBee服务器监控工具
42 2
|
3天前
|
缓存 Linux
linux系统缓存机制
linux系统缓存机制
|
3天前
|
网络协议 Linux Shell
【linux网络(一)】初识网络, 理解四层网络模型
【linux网络(一)】初识网络, 理解四层网络模型
|
3天前
|
算法 Linux Shell
【linux进程(二)】如何创建子进程?--fork函数深度剖析
【linux进程(二)】如何创建子进程?--fork函数深度剖析
|
4天前
|
安全 Ubuntu Linux
Linux 网络操作命令Telnet
Linux 网络操作命令Telnet
17 0
Linux 网络操作命令Telnet