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是动态内存分配,所以需要调用该函数释放内存
目录
相关文章
|
3月前
|
API C++
socket编程之常用api介绍与socket、select、poll、epoll高并发服务器模型代码实现(1)
前言   本文旨在学习socket网络编程这一块的内容,epoll是重中之重,后续文章写reactor模型是建立在epoll之上的。
36 0
|
3月前
|
监控 安全 Linux
socket编程之常用api介绍与socket、select、poll、epoll高并发服务器模型代码实现(3)
高并发服务器模型-poll poll介绍   poll跟select类似, 监控多路IO, 但poll不能跨平台。其实poll就是把select三个文件描述符集合变成一个集合了。
36 0
|
3月前
|
存储 网络协议 Unix
Linux C socket API 介绍
Socket英文愿意是“插孔”或“插座”,作为BSD UNIX的进程通信机制后,取后一种意思,通常也被称为套接字。使用TCP/IP协议的应用程序通常采用的应用编程是使用UNIX BSD的套接字Socket,来实现网络进程之间的通信。
36 0
|
3月前
|
网络协议 API
socket常用api记录
(2) close 终止读和写两个方向的数据传送。既然TCP连接是全双工的,有时候我们需要告知对端我们已经完成了数据发送,即使对端仍有数据要发送给我们。这就是我们在前一节中遇到的str_cli 函数在批量输入时的情况。图6-12展示了这样的情况下典型的函数调用。(1) close 把描述符的引用计数减1,仅在该计数变为0时才关闭套接字。我们已在4.8节讨论过这一点。使用shutdown 可以不管引用计数就激发TCP的正常连接终止序列(图2-5中由FIN开始的4个分节)。(建立与tcp服务器的连接)
11 0
|
测试技术
unittest中使用ddt后生成的测试报告名称如何修改?(如test_api_0修改成test_api_0_titile)
unittest中使用ddt后生成的测试报告名称如何修改?(如test_api_0修改成test_api_0_titile)
77 0
unittest中使用ddt后生成的测试报告名称如何修改?(如test_api_0修改成test_api_0_titile)
|
Java API
Java(JDK)13新特性之Reimplement the Legacy Socket API
Java(JDK)13新特性之Reimplement the Legacy Socket API
161 0
|
API Android开发
android 名称 版本 Api
android 名称 版本 Api
119 0
|
存储 Java C语言
|
19天前
|
缓存 前端开发 API
API接口封装系列
API(Application Programming Interface)接口封装是将系统内部的功能封装成可复用的程序接口并向外部提供,以便其他系统调用和使用这些功能,通过这种方式实现系统之间的通信和协作。下面将介绍API接口封装的一些关键步骤和注意事项。