socket之getaddrinfo()函数_socket.getaddrinfo-程序员宅基地

技术标签: 网络  socket  TCP/IP/Socket  

getaddrinfo()详解

socket编程之addrinfo结构体与getaddrinfo函数

addrinfo结构体与getaddrinfo函数

1. 概述

IPv4中使用gethostbyname()函数完成主机名到地址解析,这个函数仅仅支持IPv4,且不允许调用者指定所需地址类型的任何信息,返回的结构只包含了用于存储IPv4地址的空间。IPv6中引入了getaddrinfo()的新API,它是协议无关的,既可用于IPv4也可用于IPv6。getaddrinfo函数能够处理名字到地址以及服务到端口这两种转换,返回的是一个addrinfo的结构(列表)指针而不是一个地址清单。这些addrinfo结构随后可由套接口函数直接使用。如此以来,getaddrinfo函数把协议相关性安全隐藏在这个库函数内部。应用程序只要处理由getaddrinfo函数填写的套接口地址结构。该函数在 POSIX规范中定义了。

2. 函数说明

包含头文件
#include<netdb.h>
函数原型
int getaddrinfo( const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo **result );
参数说明
hostname:一个主机名或者地址串(IPv4的点分十进制串或者IPv6的16进制串)
service:服务名可以是十进制的端口号,也可以是已定义的服务名称,如ftp、http等
hints:可以是一个空指针,也可以是一个指向某个addrinfo结构体的指针,调用者在这个结构中填入关于期望返回的信息类型的暗示。
举例来说:如果指定的服务既支持TCP也支持UDP,那么调用者可以把hints结构中的ai_socktype成员设置成SOCK_DGRAM使得返回的仅
仅是适用于数据报套接口的信息。
result:本函数通过result指针参数返回一个指向addrinfo结构体链表的指针。
返回值:0——成功,非0——出错

参数设置

在getaddrinfo函数之前通常需要对以下6个参数进行以下设置:
nodename、servname、hints的ai_flags、ai_family、ai_socktype、ai_protocol。
在6项参数中,对函数影响最大的是nodename,sername和hints.ai_flag,
而ai_family只是有地址为v4地址或v6地址的区别。ai_protocol一般是为0不作改动。

getaddrinfo在实际使用中的几种常用参数设置
一般情况下,client/server编程中,server端调用bind(如果面向连接的还需要listen),
client则不用掉bind函数,解析地址后直接connect(面向连接)或直接发送数据(无连接)。
因此,比较常见的情况有
(1)    通常服务器端在调用getaddrinfo之前,ai_flags设置AI_PASSIVE,用于bind;
主机名nodename通常会设置为NULL,返回通配地址[::]。
(2)    客户端调用getaddrinfo时,ai_flags一般不设置AI_PASSIVE,但是主机名
nodename和服务名servname(更愿意称之为端口)则应该不为空。
(3)    当然,即使不设置AI_PASSIVE,取出的地址也并非不可以被bind,很多程序中ai_flags
直接设置为0,即3个标志位都不设置,这种情况下只要hostname和servname设置的没有问题就可以正确bind。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liurunjiang/article/details/123739037

智能推荐

win7系统中,chm文件打开无法显示内容的解决办法_win7 打开chm 不显示内容-程序员宅基地

文章浏览阅读772次。问题描述:打开----------------->选择打开方式------------------------->windows目录下的hh.chm此时,打开的文件是空白的。解决办法:1、将需要打开的chm文件压缩2、然后解压3、使用hh.chm打开完美解决..._win7 打开chm 不显示内容

Ubuntu16.04 win10 双系统 电脑开机进入 grub rescue 状态_set boot=-程序员宅基地

文章浏览阅读2.3k次。Ubuntu 16.04 win10 双系统 电脑开机进入 grub rescue 状态先初始大图:这应该是小问题,百度好多 ls # 找出Ubuntu所在的磁盘,我这里是 (hd0,gpt7) set boot=(hd0,gpt7) set prefix=(hd0,gpt7)/grub insmod normal normal不出意外可以正常启动,但是,但是,一般都..._set boot=

Hadoop格式化报错java.net.UnknownHostException:_shutdown_msg: shutting down namenode at kilon-virt-程序员宅基地

文章浏览阅读9.1k次,点赞2次,收藏6次。异常描述在对HDFS格式化,执行Hadoop namenode -format命令时,出现未知的主机名的问题,异常信息如下所示:[plain] view plain copy [shirdrn@localhost bin]$ hadoop namenode -format 11/06/22 07:33:31 INFO_shutdown_msg: shutting down namenode at kilon-virtual-machine/127.0.1.1

基于注意力机制attention结合门控循环单元GRU多维时间序列预测,GRU-Attention时间序列预测,多输入单输出模型。运行环境MATLAB版本为2020b及其以上。评价指标包括:R_gru和attention结合-程序员宅基地

文章浏览阅读159次。基于注意力机制attention结合门控循环单元GRU多维时间序列预测,GRU-Attention时间序列预测,多输入单输出模型。运行环境MATLAB版本为2020b及其以上。评价指标包括:R2、MAE、MSE、RMSE等,代码质量极高,方便学习和替换数据。_gru和attention结合

idea启动sentinel说找不到或无法加载该类 .port=8180_找不到或无法加载主类 .port=8180-程序员宅基地

文章浏览阅读1.4k次,点赞9次,收藏4次。idea启动sentinel说找不到或无法加载该类 .port=8180一、正常启动流程-Dserver.port=8180 -Dcsp.sentinel.dashboard.server=localhost:8180 -Dproject.name=sentinel-dashboard -jar (添加sentinel目录路径)sentinel-dashboard-1.8.0.jar二、出现说找不到或无法加载该类 .port=8180的解决方案idea问题新版不能直接识别命令参数要加单引号 ‘_找不到或无法加载主类 .port=8180

Redis序列化存储及其日期格式问题_redis 时间格式-程序员宅基地

文章浏览阅读4.7k次,点赞3次,收藏8次。万花从中过片页不沾身在模块开发中,使用Redis做缓存是非常常见的技术,当我们注入RedisTempate模板时redisTemplate.opsForValue().set("item_"+id,itemModel,10, TimeUnit.MINUTES);key我们可以用固定开头和商品id进行拼接,当然正常的项目开发中最好使用多级目录进行分类,这里只做演示使用可视化界面看到保存的数据是这样的这样的数据是很不容易阅读的,原因是Redis默认使用的是JAVA序列化方式,在序列化时使用了._redis 时间格式

随便推点

signature=5bb3b8b15e8bb925e301f7a4bda6fe7a,交易 b88d9b02cdb71d5a8d19a0e20e63b3b1cc272de17a15c9eddafb69...-程序员宅基地

文章浏览阅读1.1w次。47304402204fddca90b0ddb8e1e148f72f703ad50eff281ac9069f25f584811274c3ad036e02200c8beb82f12f2e28b92d3b0d80572c9715b06fdc95accdc0586010ff357b93e94121020a024484b68735e94783ef963a1baddce9623acc36f08e54c1c7..._网积里9d3c62

Windows 常用命令-开启多核处理器_如何用命令让cpu满负荷运行-程序员宅基地

文章浏览阅读6.9k次。如何进入命令行窗口方法一:Win+S 打开windows搜索框,输入cmd即可,即打开命令提示符方法二:Win+R,输入“cmd”即可文章目录常用命令查看Windows电脑CPU核心数,线程数开启多核处理器多核CPU,提高资源利用常用命令###################################################################ipconfig /displaydns # 显示dns缓存 ipconfig /flushdns # 刷新D._如何用命令让cpu满负荷运行

Mybatis中使用Foreach遍历数组__mybatis foreach 数组-程序员宅基地

文章浏览阅读1.7w次,点赞3次,收藏3次。&lt;select id="selectList" parameterType="java.util.List" resultType="java.lang.Integer"&gt; SELECT COUNT(1) FROM t_user WHERE id IN &lt;foreach collection="array" index="inde__mybatis foreach 数组

ECS官方案例3. IJobChunk_ijobentity ijobchunk-程序员宅基地

文章浏览阅读2.5k次。基于Unity2019最新ECS架构开发MMO游戏笔记2ECS系列目录基于Unity2019最新ECS架构开发MMO游戏笔记0基于Unity2019最新ECS架构开发MMO游戏笔记1官方案例解析33. IJobChunk小结DOTS 逻辑图表更新计划作者的话ECS系列目录基于Unity2019最新ECS架构开发MMO游戏笔记0基于Unity2019最新ECS架构开发MMO游戏笔记1官方案例..._ijobentity ijobchunk

使用GEO数据库获取感兴趣实验的差异表达基因_geo数据库查看特定基因生存表达情况-程序员宅基地

文章浏览阅读1.8w次,点赞8次,收藏56次。GEO是gene expression omnibus的缩写,我们可以在这个数据库中查看别人的芯片实验的结果,因此我们可以根据自己的实验需求去找相关的实验并找到这些实验中有显著差异表达的基因,具体的步骤如下:进入GEO Profiles https://www.ncbi.nlm.nih.gov/geoprofiles并输入感兴趣的实验关键词,这里我对疾病子痫感兴趣,因此我输入了子痫preecl..._geo数据库查看特定基因生存表达情况

vue3终止watch监听的办法_为什么watch监听想要暂停调用它自身就可以-程序员宅基地

文章浏览阅读8.3k次,点赞3次,收藏4次。vue3终止watch监听的办法是:将watch赋值给一个变量,当达到条件调用watch赋值的那个变量就可以终止监听了。如:_为什么watch监听想要暂停调用它自身就可以