INADDR_ANY的用法

2023-11-13

INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。 一般来说,在各个系统中均定义成为0值。

例如MontiVista Linux中在/usr/include/netinet/in.h定义为:

/* Address to accept any incoming messages.  */
#define INADDR_ANY              ((in_addr_t) 0x00000000)


一般情况下,如果你要建立网络服务器应用程序,则你要通知服务器操作系统:请在某地址 xxx.xxx.xxx.xxx上的某端口 yyyy上进行侦听,并且把侦听到的数据包发送给我。这个过程,你是通过bind()系统调用完成的。——也就是说,你的程序要绑定服务器的某地址,或者说:把服务器的某地址上的某端口占为已用。服务器操作系统可以给你这个指定的地址,也可以不给你。
如果你的服务器有多个网卡(每个网卡上有不同的IP地址),而你的服务(不管是在udp端口上侦听,还是在tcp端口上侦听),出于某种原因:可能是你的服务器操作系统可能随时增减IP地址,也有可能是为了省去确定服务器上有什么网络端口(网卡)的麻烦 —— 可以要在调用bind()的时候,告诉操作系统:“我需要在 yyyy 端口上侦听,所以发送到服务器的这个端口,不管是哪个网卡/哪个IP地址接收到的数据,都是我处理的。”这时候,服务器程序则在0.0.0.0这个地址上进行侦听。例如:
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
……
udp4       0      0  *.7913                 *.*                   
udp4       0      0  *.7911                 *.*
tcp4       0      0  *.ftp                  *.*                    LISTEN
……
……
以上这些是网络侦听的情况,其中Local Address 为 “*.ftp”、“*.7911”等,代表了服务程序绑定了服务器的所有网卡。
好了,你明白了侦听INADDR_ANY是什么意思了,那么,我的服务器有N个IP地址,会不会收到重复的数据包?收到数据包后,是不是会重复回复客户端呢?
答案是:不会收到重复的数据包,也不会重复发送数据。
为什么呢?因为路由的关系,从客户端来的IP包只可能到达其中一个网卡。同时在服务器进程发送数据时,操作系统根据自身维护着的路由表,决定IP数据包应该c从哪一个outbound的gateway向目标端发送。根据gateway选择的不同,也就决定了从哪一个网卡/哪个IP地址发送。
为什么不会接收到重复的数据包呢?
答:因为客户端只向你的服务器上的唯一一个IP地址发送数据了。
为什么不会重复发送数据包呢?
答:因为发送数据包的路由(路径)是唯一的。如果服务器不知道在发送数据的时候应该向哪个地址发送数据,那么数据就会被发送到“默认网关”上。
如何选择发送数据的路径呢?
答:依照路由表的要求发送。
如果路由表的记录有重复/有冲突呢,这时候如何选择路径呢?
答:路由表记录有优先级别。一般来说,Windows操作系统的路由表记录,如果是重复的话,以后来加入的记录为准,而某些操作系统,象linux/FreeBSD是不允许加入重复的路由表记录的;
如果是专用的路由器,有路由选择算法,一般来说,到达网络上的某一点的路径是可以有很多条的。路由选择算法可以确定“最好的一条路径”,这条路径要么是延时最小的,要么是 通讯 费用最低的,要么是带宽最高的,要么是跳点最小的——究竟是如何选择,就看路由器的管理员如何配置了。


对于客户端如果绑定INADDR_ANY,情况类似。对于TCP而言,在connect()系统调用时将其绑顶到一具体的IP地址。选择的依据是该地址所在子网到目标地址是可达的(reachable). 这时通过getsockname()系统调用就能得知具体使用哪一个地址。对于UDP而言, 情况比较特殊。即使使用connect()系统调用也不会绑定到一具体地址。这是因为对UDP使用connect()并不会真正向目标地址发送任何建立连接的数据,也不会验证到目标地址的可达性。它只是将目标地址的信息记录在内部的socket数据结构之中,共以后使用。只有当调用sendto()/send()时,由系统内核根据路由表决定由哪一个地址(网卡)发送UDP packet.

P.S.

-----------------------------------------------------------------------------

在IP层中有一个路由表:
在MSDOS窗口可以运行命令:netstat -r
来显示路由表。根据路由表的条目从指定的网卡发送数据。
ARP缓存用:arp -a
来显示。
通常以太网帧的目的MAC地址,是下一跳的MAC地址。

----------------------------------------------------------------------------- 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

INADDR_ANY的用法 的相关文章

  • 【一份老网工珍藏多年的网络配置笔记,很重要!】

    01 交换机 路由器的几种配置模式及模式转换 1 用户模式 登录到交换机 路由器 时会自动进入用户模式 提示符为 switchname gt 在该模式下只能够查看相关信息 对 IOS的运行不产生任何影响 2 特权模式 用户模式下 键入 en
  • 服务器超线程的好处

    服务器超线程的好处 1 提高性能 超线程通过提高整体系统吞吐量显着提高服务器性能 通过允许多个线程在单个物理内核上同时执行 超线程减少了空闲时间并最大限度地利用了可用资源 这会加快任务执行速度并缩短应用程序的响应时间 尤其是在多线程工作负载
  • 自定义编写zabbix_agent脚本

    vi usr lib systemd system zabbix agent servicce Unit Description Zabbix Agent After syslog target After network target S
  • 基于成本和服务质量考虑的不确定性下,电动汽车充电网络基础设施需求预测和迭代优化的分层框架研究(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Python代码 数据
  • 5个步骤,教你瞬间明白线程和线程安全

    记得今年3月份刚来杭州面试的时候 有一家公司的技术总监问了我这样一个问题 你来说说有哪些线程安全的类 我心里一想 这我早都背好了 稀里哗啦说了一大堆 他又接着问 那你再来说说什么是线程安全 然后我就GG了 说真的 我们整天说线程安全 但是对
  • 前端必备的 web 安全知识手记

    前言 安全这种东西就是不发生则已 一发生则惊人 作为前端 平时对这方面的知识没啥研究 最近了解了下 特此沉淀 文章内容包括以下几个典型的 web 安全知识点 XSS CSRF 点击劫持 SQL 注入和上传问题等 下文以小王代指攻击者 话不多
  • WEB前端常见受攻击方式及解决办法总结

    一个网址建立后 如果不注意安全问题 就很容易被人攻击 下面讨论一下集中漏洞情况和放置攻击的方法 一 SQL注入 所谓的SQL注入 就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串 最终达到欺骗服务器执行恶意的SQL命
  • 2024年金三银四网络安全考试试题

    2023年金三银四网络安全考试试题 1 关于数据使用说法错误的是 A 在知识分享 案例中如涉及客户网络数据 应取敏感化 不得直接使用 B 在公开场合 公共媒体等谈论 传播或发布客户网络中的数据 需获得客户书面授权或取敏感化 公开渠道获得的除
  • Python爬虫实战:IP代理池助你突破限制,高效采集数据

    当今互联网环境中 为了应对反爬虫 匿名访问或绕过某些地域限制等需求 IP代理池成为了一种常用的解决方案 IP代理池是一个包含多个可用代理IP地址的集合 可以通过该代理池随机选择可用IP地址来进行网络请求 IP代理池是一组可用的代理IP地址
  • 揭秘网络世界的幕后密码——Wireshark网络协议分析软件

    在我们日常生活中 计算机和互联网已经成为不可或缺的一部分 然而 很少有人真正了解网络背后复杂的工作原理和通信协议 幸运的是 有一款强大而实用的软件 Wireshark 可以帮助我们深入了解网络世界的幕后密码 Wireshark是一款免费的网
  • 国外拨号VPS指南:开启你的全球网络之旅

    在当今数字化时代 互联网已经成为了我们生活的一部分 而要在全球范围内畅通无阻地访问互联网 拥有一个可靠的国外拨号VPS是非常重要的 无论您是为了工作 学习还是娱乐 国外拨号VPS都可以为您提供更广泛的网络体验 本文将为您提供国外拨号VPS的
  • 服务器VPS是什么意思?一文了解其含义与重要性

    在今天的数字时代 服务器扮演着至关重要的角色 它们是网站 应用程序和在线业务的基石 但是 你是否听说过VPS 本文将深入探讨什么是服务器VPS 以及为什么它在今天的互联网世界中如此重要 什么是服务器VPS 服务器的基本概念 在我们深入探讨V
  • 「优选算法刷题」:移动零

    嗨 这个假期罗根开始接触了算法 在为今年的蓝桥杯做准备 所以 开个新专栏 记录记录自己做算法题时的心得 一 题目 给定一个数组 nums 编写一个函数将所有 0 移动到数组的末尾 同时保持非零元素的相对顺序 请注意 必须在不复制数组的情况下
  • 「优选算法刷题」:快乐数

    一 题目 编写一个算法来判断一个数 n 是不是快乐数 快乐数 定义为 对于一个正整数 每一次将该数替换为它每个位置上的数字的平方和 然后重复这个过程直到这个数变为 1 也可能是 无限循环 但始终变不到 1 如果这个过程 结果为 1 那么这个
  • 内网安全:隧道技术详解

    目录 隧道技术 反向连接技术 反向连接实验所用网络拓扑图及说明 网络说明 防火墙限制说明 实验前提说明 实战一 CS反向连接上线 拿下Win2008 一 使用转发代理上线创建监听器 二 上传后门执行上线 隧道技术 SMB协议 SMB协议介绍
  • 网络安全(黑客)自学启蒙

    一 什么是网络安全 网络安全是一种综合性的概念 涵盖了保护计算机系统 网络基础设施和数据免受未经授权的访问 攻击 损害或盗窃的一系列措施和技术 经常听到的 红队 渗透测试 等就是研究攻击技术 而 蓝队 安全运营 安全运维 则研究防御技术 作
  • 高防服务器什么意思

    高防服务器什么意思 为什么要用高防服务器 小编为您整理发布高防服务器什么意思的解读 高防服务器是指具备较高防御能力的服务器 能够抵御DDoS CC等网络攻击 高防服务器通常用于保护游戏 APP 金融 电商等业务 这些领域因为其业务特性 容易
  • 最大流-Dinic算法,原理详解,四大优化,详细代码

    文章目录 零 前言 一 概念回顾 可略过 1 1流网络 1 2流 1 3最大流 1 4残留网络 1 5增广路
  • 网工内推 | 上市公司同程、科达,五险一金,年终奖,最高12k*15薪

    01 同程旅行 招聘岗位 网络工程师 职责描述 1 负责职场 门店网络规划 建设 维护 2 负责网络安全及访问控制 上网行为管理和VPN设备的日常运维 3 负责内部相关网络自动化和系统化建设 4 优化与提升网络运行质量 制定应急预案 人员培
  • 网络安全行业热门认证证书合集

    网络安全认证证书 就和学历一样是敲门砖 拿到了可以用不到 但不能没有 技术大牛可以没有证书 但普通人不能没有 1 初级入门 就像学历在职场上展示一个人的基本素养一样 网络安全认证证书可以展示一个人在网络安全领域具备的基本知识和技能 它为初学

随机推荐

  • Ajax定时调用封装

    var dataUpload ajax请求数据 method function murl mdata method time1 time2 success 首次读取 setTimeout function aJax time1 定时读取函数
  • Vue3.2中使用swiper实现层叠式轮播图

    介绍 在 vue3 中使用 swiper 实现缩略图的轮播图效果 具体如下图所示 代码
  • tensorflow2调用huggingface transformer预训练模型

    tensorflow2调用huggingface transformer预训练模型 一点废话 huggingface简介 传送门 pipline 加载模型 设定训练参数 数据预处理 训练模型 结语 一点废话 好久没有更新过内容了 开工以来就
  • python爬取美女_知乎大神用Python爬取高颜值美女(Python爬虫+人脸检测+颜值检测)...

    import time import os import re import requests from lxml import etree from aip import AipFace 百度云 人脸检测 申请信息 唯一必须填的信息就这三
  • 对List集合进行自定义规则排序

    这次的场景是要对一个List lt 对象 gt 中的某个属性进行自定义排序 废话不多说 直接上代码 首先你要自定义一个排序规则 比如下面这种 public class MySort public static final HashMap
  • 西普部分CTF题目(web)(持续更新)

    1 菊花 题目地址 http www simplexue com ctf examctfdetail 729 点击 我是吊死 进入sim php页面 post参数为id 提示需要net framework 9 9 用burp拦截 修改use
  • JS 实现抛物线动画案例

    相信大家都有浏览过 很多购物网站购物车的添加商品动画 今天 我们就手写一个简单的抛物线动画 先上案例 一 绘制页面 我们这里简单实现 一个按钮 一个购物车图标 样式这里直接跳过 最终dom结构 div class container div
  • eclipse 编译dubbo2.8.4 源码

    第一步 准备工作 下载dubbox的源代码 下载地址 https github com dangdangdotcom dubbox 第二步 编译源代码 maven编译工具 打开CMD命令窗口 切换到dubbox源代码的所在文件夹 E wor
  • Java——数据结构之顺序表

    文章目录 Java 数据结构之顺序表 1 顺序表的简单了解 2 接口的实现 1 创建初始变量 2 打印顺序表 3 添加元素 4 判断是否包含元素 5 查找元素的下标 6 获取 pos 位置的元素 7 更新pos 位置的元素值 8 删除元素
  • pip install报错 [ImportError]: DLL load failed while importing _socket:参数错误

    pip install 时报错 ImportError DLL load failed while importing socket 参数错误 开始以为是虚拟环境的问题 换了虚拟环境还是不行 百度到了解决办法 Win7系统需要安装KB253
  • Spring系列——Spring MVC配置文件

    Spring系列 Spring MVC配置文件 一 前端控制器DispatcherServlet 二 RequestMapping注解 1 使用方法 1 1 标注在方法上 1 2 标注在类上 2 RequestMapping注解的属性 3
  • 机器视觉入门之路(三九--A,霍夫变换(hough transform)寻找直线,c++)

    xy坐标系直线 y kx b 请看图 假定红色线段上的所有样本点 100个 都满足上面的直线方程 a图 也就是说 红色的点 x1 y1 x2 y2 x3 y3 x98 y98 x99 y99 x100 y100 带入方程 只能求出一个k值和
  • Redis入门(一)

    第1章 NoSQL 1 1 NoSQL数据库 1 1 1 NoSQL是什么 1 NoSQL Not Only SQL 意即 不仅仅是SQL 泛指非关系型的数据库 2 NoSQL不拘泥于关系型数据库的设计范式 放弃了通用的技术标准 为某一领域
  • 圆相交 马蹄集

    圆相交 难度 白银 0时间限制 1秒 巴占用内存 64M 输入2个圆的圆心的坐标值 x y 和半径 判断2个圆是否相交 输出YES或者 NO 格式 输入格式 输入整型 空格分隔 每行输入一组信息 输出格式 输出YES或者NO Created
  • 《计算机组成原理实验》 多周期CPU

    计算机组成原理实验 多周期CPU 前言 这是中山大学2018年计算机组成原理实验中多周期CPU的实验报告 仿真与写板的内容暂略 所有源代码 包括写板 已经上传至我的github当中 欢迎大家访问 github个人主页 https stara
  • wxWidgets多线程及事件传递

    前言 最近忙着写项目 wxWidgets计划还有wxWidgets日志系统的拦截重定向 剩下一些比较杂的知识点 想到哪写到哪 比如进程间通信 调用外部程序后结束本程序 用于升级程序 集成带窗口的ActiveX 创建单进程程序等 这些文档上基
  • 分享66个HTML&CSS源码,总有一款适合您

    HTML CSS源码 分享66个HTML CSS源码 总有一款适合您 下面是文件的名字 我放了一些图片 文章里不是所有的图主要是放不下 大家下载后可以看到 源码下载链接 https pan baidu com s 1AeVqON7byvt
  • 常用的HDFS操作

    常用的HDFS操作 利用Hadoop提供的shell命令完成任务 1 向HDFS中上传任意文本文件 如果指定的文件在HDFS中已经存在 由用户指定是追加到原有文件末尾还是覆盖原有文件 2 从HDFS中下载指定文件 如果本地文件与要下载的文件
  • C++BUG: [Error] invalid array assignment

    C BUG Error invalid array assignment 1 Introduction 2 memcpy 函数原型 功能 头文件 返回值 与strcpy的区别 实例 1 Introduction 在使用数组给数组赋值时 会出
  • INADDR_ANY的用法

    INADDR ANY就是指定地址为0 0 0 0的地址 这个地址事实上表示不确定地址 或 所有地址 任意地址 一般来说 在各个系统中均定义成为0值 例如MontiVista Linux中在 usr include netinet in h定