INADDR_ANY就是指定地址为0.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地址。   -----------------------------------------------------------------------------

INADDR_ANY的理解相关推荐

  1. 十个问题理解Linux epoll工作原理

    作者:dustinzhou,腾讯 IEG 运营开发工程师 epoll 是 linux 特有的一个 I/O 事件通知机制.很久以来对 epoll 如何能够高效处理数以百万记的文件描述符很有兴趣.近期学习 ...

  2. 深入理解select、poll和epoll及区别

    问题:如果我们先前创建的几个进程承载不了目前快速发展的业务的话,是不是还得增加进程数?我们都知道系统创建进程是需要消耗大量资源的,所以这样就会导致系统资源不足的情况. 那么有没有一种方式可以让一个进程 ...

  3. 处理大并发之一 对epoll的理解,epoll客户端服务端代码

    http://blog.csdn.net/zhuxiaoping54532/article/details/56494313 处理大并发之一 对epoll的理解,epoll客户端服务端代码 序言: 该 ...

  4. 处理大并发之二 对epoll的理解,epoll客户端服务端代码

    http://blog.csdn.net/wzjking0929/article/details/51838370 序言: 该博客是一系列的博客,首先从最基础的epoll说起,然后研究libevent ...

  5. _一文让你透彻理解Linux的SOCKET编程(含实例解析)

    1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 U ...

  6. 高并发网络编程之epoll(个人遇到最好理解的一篇文章、易懂)

    LT 和 ET本质的区别是: LT模式状态时,主线程正在epoll_wait等待事件时,请求到了,epoll_wait返回后没有去处理请求(recv),那么下次epoll_wait时此请求还是会返回( ...

  7. 十个问题理解Linux epoll工作原理:惊群,

    目录 Question 1:是否所有的文件类型都可以被 epoll 监视?不是 Question 2:ep->wq 的作用是什么? Question 3:什么是 epoll 惊群? Questi ...

  8. 深入理解Linux/Unix文件描述符和epoll

    Linux/Unix 文件描述符(File Describer)的本质 Linux/Unix(以下简称Linux)系统中,每个进程都有一个专用的数组,数组的元素是一个结构体,称为文件描述符File D ...

  9. 网络编程之 字节序和深入理解bind()函数

    在上一篇博客里,大家也许会对htons()感到疑惑吧,其实就是字节序的转换,所以这篇博客我们就来详细的解释一下什么是字节序. 也就是让大家对 bind函数有更加深刻而性感的认识 计算机是小端字节序,网 ...

最新文章

  1. JavaScript的基础学习篇
  2. CIW《操作系统安全》目录
  3. 数据库开发——MySQL——数据类型——非数值类型
  4. 去广州见了我大学老师标哥
  5. cpri带宽不足的解决方法_u盘容量不足怎么办 u盘容量不足解决方法【介绍】
  6. oracle与db2 市场占有率,oracle 与 DB2 的区别
  7. 采用Angular勾画SVG圆环形进度条
  8. studentdeng的博客
  9. self = [super init]的解释
  10. 视频教程-R语言入门基础-大数据
  11. 【软件工程】——软件需求说明书
  12. 阿里云服务器如何登录?阿里云服务器的三种登录方法...
  13. Adobe Flash Player 不是最新版本
  14. 利用MATLAB计算输出响应,[笔记]离散系统的频率响应和输出响应的matlab实现.doc
  15. C语言实验——交换两个整数的值(顺序结构)
  16. 为什么感觉现在电脑病毒少了?
  17. 计算机病毒互助百科,病毒百科——计算机病毒分类
  18. Rap部署本地服务器
  19. 完美解决Ubuntu16.04虚拟机窗口全屏问题
  20. Eclipse中将Tab键换成Space键

热门文章

  1. iphone连上wifi却上不了网_必收藏为什么手机信号满格,却上不了网,4招为你解决...
  2. 每个c语言程序写完后 都要按照,c语言基础学习小结(习题总结)(5页)-原创力文档...
  3. 蓝卡获得地_德国蓝卡究竟是什么?为什么这么多人都想移民德国?
  4. div搜索框与按钮不在一行_前阿里巴巴运营专家:搜索框的5大运营玩法
  5. 8、计算机图形学——纹理的相关问题及解决办法
  6. python opencv教程rtsp server_Python多进程opencv调用rtsp视频流
  7. php循环输出sql数组吗,在PHP中循环SQL结果 – 没有获得整个数组
  8. GridView 实现LinkButton下载文件/附件
  9. Android菜单详解(一)——理解android中的Menu
  10. Hadoop集群系列(目录)