socket绑定INADDR_ANY,那会怎样?(例如:双通机房多网卡多IP设置)

IP地址本地字节序与网络字节序的转换函数 IP地址本地字节序的转换函数有以下几种: 1、uint32_t htonl(uint32_t hostlong); //一般不用来转换ip地址 这个函数是int转int型,而我们习惯用的ip的是点分十进制的字符串。 用起来不方便,所以,此函数数用来将32位(4字节整型)进行字节序转换。 ps: INADDR_ANY,当不指定ip地址时,可以直接用该宏定义,最简单。 addr.sin_addr.s_addr = htonl(INADDR_ANY);//自动获取当前网卡的有效ip地址 2、in. 阅读详情
 


我也回复一个!!
其中INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。

一般情况下,如果你要建立网络服务器,则你要通知服务器操作系统:请在某地址 xxx.xxx.xxx.xxx上的某端口 yyyy上进行侦听,并且把侦听到的数据包发送给我。这个过程,你是通过bind()系统调用完成的。——也就是说,你的程序要绑定服务器的某地址,或者说:把服务器的某地址上的某端口占为已用。服务器操作系统可以给你这个指定的地址,也可以不给你。

如果你的服务器有多个网卡,
而你的服务(不管是在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地址发送数据了。

为什么不会重复发送数据包呢?
答:因为发送数据包的路由(路径)是唯一的。如果服务器不知道在发送数据的时候应该向哪个地址发送数据,那么数据就会被发送到“默认网关”上。

如何选择发送数据的路径呢?
答:依照路由表的要求发送。

如果路由表的记录有重复/有冲突呢,这时候如何选择路径呢?
答:路由表记录有优先级别。一般来说,Windows操作系统的路由表记录,如果是重复的话,以后来加入的记录为准,而某些操作系统,象linux/FreeBSD是不允许加入重复的路由表记录的。

 

 

如果路由表的记录有重复/有冲突呢,这时候如何选择路径呢?
答:路由表记录有优先级别。一般来说,Windows操作系统的路由表记录,如果是重复的话,以后来加入的记录为准,而某些操作系统,象linux/FreeBSD是不允许加入重复的路由表记录的;

如果是专用的路由器,有路由选择算法,一般来说,到达网络上的某一点的路径是可以有很多条的。路由选择算法可以确定“最好的一条路径”,这条路径要么是延时最小的,要么是通讯费用最低的,要么是带宽最高的,要么是跳点最小的——究竟是如何选择,就看路由器的管理员如何配置了。

 
5-EP4CE10F17C8-引脚配置 EP4CE10F17C8-引脚配置 阅读详情

相关推荐

RK3588平台开发系列讲解(硬件篇-功能外设2)

RK3588 芯片内置两个USB3.0 OTG控制器(内嵌2个USB2.0 OTG,下图绿色处),1个USB3.0 HOST 控制器,2个USB2.0 HOST控制器。这些控制器与PHY的内部复用图如下:USB3.0 OTG0 控制器支持SS/HS/FS/LS, 内嵌的USB2.0(HS/FS/LS)信号采用USB2.0 OTG PHY, 信号名见下图的红色方框内;RK3588目前仅此接口支持做Fireware的Download,应用中请务必要预留出。

whm128的博客 2447

socket绑定ipINADDR_ANY 的意义 htonl(INADDR_ANY)0.0.0.0所有地址、不确定地址、任意地址)(htonl和htons区别)

参考文章:socket绑定ipINADDR_ANY 的意义

Dontla的博客 8533

中山大学数字电路与逻辑设计 期末试卷.zip

中山大学数字电路与逻辑设计 期末试卷

Unix网络编程中INADDR_ANY"的含义是什么?

写在前面:总之就是表示本机的IP地址 因为一个主机可能不像我们普通的笔记本一般只拥有一块网卡,这对于需要进行大规模处理并发消息的服务器来说更是。所以将sin_addr.s_addr设置INADDR_ANY就是等于能够证明主机IP地址的所有IP。因为这个字符串0.0.0.0转换成网络通用的二进制地址就是0,所以可以不加htonl将其转换成网络通用格式,但是为了标准的归一化,建议如下使用: s...

苞米地里捉小鸡的博客 1073

socket绑定ipINADDR_ANY 的意义

socket INADDR_ANY 监听0.0.0.0地址 socket绑定端口让路由表决定传到哪个ip 其中INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。 一般情况下,如果你要建立网络服务器,则你要通知服务器操作系统:请在某地址 xxx.xxx.xxx.xxx上的某端口 yyyy上进行侦听,并且把侦听到的数据包发

linus_Robot的博客 3万+

Linux— 网络编程套接字

我们知道IP地址可以标识主机唯一性,但是每一台主机上的客户或服务进程的唯一性用什么来标识呢?为了更好的标识一台主机上服务进程的唯一性,采用标识服务器进程,客户端进程的唯一性。端口号(port)是传输层协议的内容.端口号是一个2字节16位的整数;端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;IP地址 + 端口号能够标识网络上的某一台主机的某一个进程;

一个努力拼搏的人 2226

Socket网络编程】1.bind()INADDR_ANY 解析

bind()INADDR_ANY 解析 linux网络编程之UDP通信 http://blog.sina.com.cn/s/blog_c2f250bd0101ii14.html 该博客讲了tcp和udp的一些常用参数 bind()解析 当使用socket()创建套接字后,只赋予其所使用的协议,并未分配地址。 在接受其它主机的连接前,必须先调用bind()为套接字分配一个地址。 bind() 一般用于服务器端,将一个套接字与一个套接字地址结构相关联,比如,关联一个指定的本地端口和IP地址。 bind()

u011754972的博客 2996

服务器端地址选择——“INADDR_ANY

客户端需要知道服务器ip地址和端口port之后,才能和服务器端建立通信。 tcpclient.c struct sockaddr_in servaddr; servaddr.sin_family = AF_INET; servaddr.sin_port = htons(12345); inet_pton(AF_INET,argv[1],&seraddr.sin_addr); t...

慢慢冲鸭子的博客 4530

socket INADDR_ANY 监听0.0.0.0地址 socket绑定端口让路由表决定传到哪个ip

socket INADDR_ANY 监听0.0.0.0地址 socket绑定端口让路由表决定传到哪个ip 其中INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。 一般情况下,如果你要建立网络服务器,则你要通知服务器操作系统:请在某地址 xxx.xxx.xxx.xxx上的某端口 yyyy上进行侦听,并且把侦听到的数据包发送给

lizhi200404520的专栏 5066

socket编程中htonl和htons深入探讨

socket编程中htonl和htons深入探讨背景:问题分析和解决:深入分析: 背景:   在socket编程中遇到一个错误:server端设置端口和ip时,使用htonl函数。然后client死活无法连接,一致报错 connect error: Connection refused(errno:111) 问题代码: serveraddr.sin_addr.s_addr = htonl(INA...

CharlesJhonson的博客 6821

[摘抄-Socket-学习中]socket监听本地IPINADDR_ANY)以及获取本地IP地址

网络编程socket深入探索中,前期已经了解过基础的网络编程,但太过浅显,只知道基础的几次握手和数据传输而已,但其中的明细和规则不是特别了解,故进一步探索,继续记录归档。

junk1357的专栏 6127

关于socket编程中的INADDR_ANY

在Server端bind本机IP地址和端口的时候,有些程序会使用INADDR_ANY这个地址来取代本机地址。这是为什么呢? 加了printf把INADDR_ANY打印出来看了一下,居然是零。 查了一些资料和代码,MAC中INADDR_ANY是定义在in.h中的: #define INADDR_ANY (u_int32_t)0x00000000 所以打印出来是零。 那么,这个宏定

稻草人的专栏 6303

socket INADDR_ANY

Socket INADDR_ANY详解 linux下的socket INADDR_ANY表示的是一个服务器上所有的网卡(服务器可能不止一个网卡) 多个本地ip地址都进行绑定端口号,进行侦听。 不光是多个网卡的问题. 见如下server listen: 80           0.0.0.0               //INADDR_ANY,外部的client

上善若水 3430

linux网络编程(1)

(一). SOCKET编程 1.socket 一个fd指向一个socket,内核开辟两个缓冲区与之对应,管道是一个fd对应一个缓冲区 2.网络字节序转换函数 htonl,htons ntohl,ntohs 3.IP地址转换函数 1.点分十进制转网络字节序(string ---> uint_32) int inet_pton(int af, const char * src, void * dst); af: AF_INET 、AF_INET6 src: 传入的是点分十进制ip地址

code_charMing的博客 936

INADDR_ANY的确切含义

INADDR_ANY就是inet_addr("0.0.0.0")服务器首先,须要明确的是当服务器的监听地址是INADDR_ANY设置的是服务器IP地址。网络其次,当服务器的监听地址是INADDR_ANY时含义是让服务器端计算机上的全部网卡的IP地址均可以做为服务器IP地址,也即监听外部客户端程序发送到服务器端全部网卡的网络请求。socket好比,个人网络为:192.168.1.102. 因而就有下面的程序:函数服务端:spa。...

木牛的博客 5859

网络编程】TCP/UDP(socket编程)

TCP/UDP背景知识源IP地址和目的IP地址端口号源端口号和目的端口号网络字节序socket编程socket 常见APIsockaddr结构地址转换函数UDP基本概念UDP服务器和客户端框架服务器(Server)客户端(Client)TCP基本概念三级目录 背景知识 源IP地址和目的IP地址 在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址。 应为在链路层传输的时候,只需要去更改MAC的地址但是最终发到哪里是通过识别IP来确定的。 端口号 端口号(port)是传输层协议的

Anton的博客 1360

INADDR_ANY的用法

INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。 一般来说,在各个系统中均定义成为0值。例如MontiVista Linux中在/usr/include/netinet/in.h定义为:/* Address to accept any incoming messages.  */#define INADDR_ANY  

lyzhm的专栏 8223

INADDR_ANY

INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。 一般来说,在各个系统中均定义成为0值。  例如MontiVista Linux中在/usr/include/netinet/in.h定义为:  /* Address to accept any incoming messages.  */  #define INADDR

guomei的专栏 707

关于inaddr_any和UDP中的sendto

UDP中由于没有connect到目标机的iP地址

u013176681的专栏 2610
上一篇: 遵循placement new的用法规范
下一篇: 国际:如何识别真正的程序员
herman~~
博客等级 码龄23年 285粉丝 98原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值