socket名称与地址转换api

本文涉及的产品
公网NAT网关,每月750个小时 15CU
简介: 注意gethostbyname & gethostbyaddr函数已被引入 getaddrinfo 函数弃用。敦促应用程序的开发人员使用 getaddrinfo 函数而不是 gethostbyname。

名字与地址转换

gethostbyname函数和gethostbyaddr函数

检索主机信息

注意gethostbyname & gethostbyaddr函数已被引入 getaddrinfo 函数弃用。 敦促应用程序的开发人员使用 getaddrinfo 函数而不是 gethostbyname。

#include <netdb.h>//windows是winsock2.h
typedef struct hostent {
   
  char  *h_name;//主机 (电脑) 的官方名称。 如果使用 DNS 或类似的解析系统,则它是完全限定的域名 (FQDN) 导致服务器返回答复。 如果使用本地主机文件,则它是 IPv4 地址后的第一个条目。
  char  **h_aliases;//以 NULL 结尾的备用名称数组。
  short h_addrtype;//要返回的地址的类型。
  short h_length;//每个地址的长度(以字节为单位)。
  char  **h_addr_list;//主机地址的 NULL 终止列表。 地址按网络字节顺序返回。 宏 h_addr 定义为h_addr_list[0] 与较旧的软件兼容。(前面是ip地址,后面是主机名)
} HOSTENT, *PHOSTENT, *LPHOSTENT;

//gethostbyname 函数从主机数据库中检索与主机名对应的主机信息。
hostent* gethostbyname(const char *name);
//name:域名(有些版本可以输入点十进制的ip地址)

//gethostbyaddr 函数检索与网络地址对应的主机信息。
struct hostent* gethostbyaddr(const char *addr,int len,int type);
/*
addr:点十进制ip地址
len:地址长度
type:地址类型
*/

//如果未发生任何错误, gethostbyname & gethostbyaddr将返回指向上述主机结构指针。否则,它返回 null 指针,可以通过调用 WSAGetLastError 来检索特定的错误号。

getservbyname & getservbyport

#include <netdb.h>//windows是winsock2.h
servent* getservbyname(const char *name,const char *proto);//检索与服务名称和协议对应的服务信息。
servent* getservbyport(int port,const char *proto);//检索与端口和协议对应的服务信息。

typedef struct servent {
   
  char  *s_name;        //服务的正式名称。
  char  **s_aliases;    //以 NULL 结尾的备用名称数组。
  short s_port;            //可以联系服务的端口号。 端口号按网络字节顺序返回。
  char  *s_proto;        //联系服务时要使用的协议的名称。
};
/*
name:指向 null 终止的服务名称的指针。
port:服务端口
proto:指向 以 null 结尾的协议名称的指针。如果此指针为 NULL,
        getservbyname 函数将返回第一个服务条目,其中名称与 servicent 结构s_name成员或 servicent 结构的s_aliases成员匹配。 否则, getservbyname 与 名称和proto 匹配。
        getservbyport 将返回端口与服务结构s_port匹配的第一个服务条目。 否则, getservbyport 与端口和proto 参数匹配。

返回值:如果未发生错误,getservbyname & getservbyport将返回指向 servent 结构的指针。 否则,它返回 null 指针
*/

getaddrinfo

getaddrinfo 函数提供从 ANSI 主机名到地址的独立于协议的转换。

#include <netdb.h>//windows==ws2tcpip.h

typedef struct addrinfo {
   
  int             ai_flags;        //指示 getaddrinfo 函数中使用的选项的标志。
  int             ai_family;    //地址类型
  int             ai_socktype;    //套接字类型
  int             ai_protocol;    //协议类型
  size_t          ai_addrlen;    //ai_addr成员指向的缓冲区的长度(以字节为单位)。
  char            *ai_canonname;//主机的规范名称。
  struct sockaddr *ai_addr;        //指向 sockaddr 结构的指针。每个返回的addrinfo结构中的ai_addr成员指向填充的套接字地址结构。每个返回的addrinfo结构的长度(以字节为单位)在ai_addrlen成员中指定。
  struct addrinfo *ai_next;        //指向链接列表中的下一个结构的指针
};

int getaddrinfo(const char *nodename, const char *servicename,const struct addrinfo *hints,struct addrinfo **res);
/*
nodename:该字符串包含主机 (节点) 名称或数字主机地址字符串。
servicename:该字符串包含表示为字符串的服务名称或端口号。
hints:可以是一个空指针,也可以是一个指向某个addrinfo结构的指针,调用者在这个结构中填入关于期望返回的信息类型的暗示。举例来说:如果指定的服务既 支持TCP也支持UDP,那么调用者可以把hints结构中的ai_socktype成员设置成SOCK_DGRAM使得返回的仅仅是适用于数据报套接口 的信息。
res:通过res参数返回一个指向addrinfo结构链表的指针
result value:成功返回0
*/

const char* gai_strerror(int error);//返回一个指出对应错误信息的字符串
void freeaddrinfo(addrinfo* ai);//由于getaddrinfo所返回的res是动态内存分配,所以需要调用该函数释放内存
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
4月前
|
API 网络架构 开发者
【Azure API 管理】APIM服务资源删除后,为什么不能马上创建相同名称的APIM服务呢?
【Azure API 管理】APIM服务资源删除后,为什么不能马上创建相同名称的APIM服务呢?
|
1月前
|
API
国家名称大全免费API接口教程
此API提供全球国家信息查询服务,包括坐标、中英文名称、简称及域名后缀。支持POST/GET请求,需提供用户ID和KEY。返回状态码、消息内容及结果集。示例URL:https://cn.apihz.cn/api/other/country.php?id=88888888&key=88888888。详情见:https://www.apihz.cn/api/country.html。
59 15
|
1月前
|
存储 JSON API
淘宝API接口实战:高效获取商品标题、分类及店铺名称
在淘宝API接口实战中,通过以下步骤高效获取商品标题、分类及店铺名称:1. 准备工作:了解淘宝开放平台文档,注册开发者账号,选择开发语言和工具。2. 获取API访问权限:申请相应权限,提供应用场景说明。3. 调用API接口:构建HTTP请求,提供必要参数。4. 解析响应数据:提取JSON数据中的所需信息。5. 数据处理和存储:进一步处理并存储数据。6. 注意事项:遵守使用规范,注意调用频率和数据安全。示例代码使用Python调用淘宝API。
|
4月前
|
API 网络架构
【Azure API 管理】如何修改Azure APIM的管理员邮箱和组织名称
【Azure API 管理】如何修改Azure APIM的管理员邮箱和组织名称
|
7月前
|
监控 安全 Linux
socket编程之常用api介绍与socket、select、poll、epoll高并发服务器模型代码实现(3)
高并发服务器模型-poll poll介绍   poll跟select类似, 监控多路IO, 但poll不能跨平台。其实poll就是把select三个文件描述符集合变成一个集合了。
83 0
|
7月前
|
存储 网络协议 Unix
Linux C socket API 介绍
Socket英文愿意是“插孔”或“插座”,作为BSD UNIX的进程通信机制后,取后一种意思,通常也被称为套接字。使用TCP/IP协议的应用程序通常采用的应用编程是使用UNIX BSD的套接字Socket,来实现网络进程之间的通信。
76 0
|
7月前
|
网络协议 API
socket常用api记录
(2) close 终止读和写两个方向的数据传送。既然TCP连接是全双工的,有时候我们需要告知对端我们已经完成了数据发送,即使对端仍有数据要发送给我们。这就是我们在前一节中遇到的str_cli 函数在批量输入时的情况。图6-12展示了这样的情况下典型的函数调用。(1) close 把描述符的引用计数减1,仅在该计数变为0时才关闭套接字。我们已在4.8节讨论过这一点。使用shutdown 可以不管引用计数就激发TCP的正常连接终止序列(图2-5中由FIN开始的4个分节)。(建立与tcp服务器的连接)
49 0
|
存储 Java C语言
|
7天前
|
人工智能 自然语言处理 API
Multimodal Live API:谷歌推出新的 AI 接口,支持多模态交互和低延迟实时互动
谷歌推出的Multimodal Live API是一个支持多模态交互、低延迟实时互动的AI接口,能够处理文本、音频和视频输入,提供自然流畅的对话体验,适用于多种应用场景。
46 3
Multimodal Live API:谷歌推出新的 AI 接口,支持多模态交互和低延迟实时互动
下一篇
DataWorks