社区
网络编程
帖子详情
socket绑定INADDR_ANY,那会怎样?
skyMountain
2005-04-08 03:54:35
ANY是“任意一个”还是“所有的”的意思?
在多网卡地址上,绑定INADDR_ANY之后,再向某地址发送一个数据包,那么这个数据包是从哪个网卡发送出去?任意一个网卡,还是每张网卡都发送一次?如果是后者,那么对方岂不是可能收到重复的数据包?
...全文
926
14
打赏
收藏
socket绑定INADDR_ANY,那会怎样?
ANY是“任意一个”还是“所有的”的意思? 在多网卡地址上,绑定INADDR_ANY之后,再向某地址发送一个数据包,那么这个数据包是从哪个网卡发送出去?任意一个网卡,还是每张网卡都发送一次?如果是后者,那么对方岂不是可能收到重复的数据包?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
skyMountain
2005-04-10
打赏
举报
回复
好,多谢楼上各位!
Minai
2005-04-09
打赏
举报
回复
在IP层中有一个路由表:
在MSDOS窗口可以运行命令:netstat -r
来显示路由表。根据路由表的条目从指定的网卡发送数据。
ARP缓存用:arp -a
来显示。
通常以太网帧的目的MAC地址,是下一跳的MAC地址。
skyMountain
2005-04-09
打赏
举报
回复
to楼上:
你的意思是说网卡会自动检测哪张网卡能到达目的地址?不大可能吧,请问有什么根据吗?我这里没有开发环境,无法测试。
iorikingdom
2005-04-09
打赏
举报
回复
先arp -d 删除原来有的IP-MAC记录
然后测试你的程序,用嗅探器看看你是不是每个网卡都发送了ARP命令就可以了,不过如果你IP-MAC表已经有记录的话,是不会再发送ARP请求的,所以你每次看每个网卡是否有send arp的话,应该先
arp -d
yrh79
2005-04-09
打赏
举报
回复
以上最后一条,加上一点:
如果路由表的记录有重复/有冲突呢,这时候如何选择路径呢?
答:路由表记录有优先级别。一般来说,Windows操作系统的路由表记录,如果是重复的话,以后来加入的记录为准,而某些操作系统,象linux/FreeBSD是不允许加入重复的路由表记录的;
如果是专用的路由器,有路由选择算法,一般来说,到达网络上的某一点的路径是可以有很多条的。路由选择算法可以确定“最好的一条路径”,这条路径要么是延时最小的,要么是通讯费用最低的,要么是带宽最高的,要么是跳点最小的——究竟是如何选择,就看路由器的管理员如何配置了。
yrh79
2005-04-09
打赏
举报
回复
我也回复一个!!
其中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是不允许加入重复的路由表记录的。
iorikingdom
2005-04-08
打赏
举报
回复
应该是这样的,网卡都向外网发送一个SendARP请求,
那个网卡返回ARP应答包的,从应答包里面拿出地址
网卡就向那个地址发送数据包
Wenxy1
2005-04-08
打赏
举报
回复
实际上就是你的socket没有与指定的网卡绑定,系统会随机的选网络接口发送数据。
ZhangYv
2005-04-08
打赏
举报
回复
skyMountain(天山):
那你就不要指定INADDR_ANY,因为有些比如路由器之类的设备需要连接服务器,所以才有了INADDR_ANY这种东西。
Caps77
2005-04-08
打赏
举报
回复
关注!
skyMountain
2005-04-08
打赏
举报
回复
我用的是udp,没有连接的。楼上的意思是说:我可以接收任意一个网卡上收到的数据包,但是发送数据包却会从其中一个网卡发出去,对吗?
有双网卡的机器大多是一个接公网,一个接内网。按这样说来,如果在这样的机器上绑定INADDR_ANY,那么很可能软件无法运行?收到公网的数据请求,却可能会将答复发送到内网上。
ZhangYv
2005-04-08
打赏
举报
回复
允许任何网络设备接口连接并处理的意思。一个数据包只能由一个网卡发出和接收。
UDP.rar_IPPROTO_UDP_UDP监听_WSAStartup_sock_DGRAM
1、首先需要定义的对象:
SOCKET
Receiving
Socket
//接收端的
Socket
SOCK
ADD
R_IN Receiver
Add
r //接收端的地址信息 char ReceiveBuf[1024] //接收数据缓冲区大小 int BufLength //缓冲区长度 SOCK
ADD
R_IN Sender
Add
r //发送数据端地址信息 int Sender
Add
rSize = sizeof(Sender
Add
r) //发送端地址信息的长度 2、启动WSA动态库: WSAStartup(MAKEWORD(2,2),&wsd) 3、创建
socket
: Receiving
Socket
=
socket
(AF_INET,SOCK_DGRAM,IPPROTO_UDP) 4、初始化服务器地址及监听端口 Receiver
Add
r.sin_family=AF_INET //家族 Receiver
Add
r.sin_port=htons(9000) //设置端口号 Receiver
Add
r.sin_
add
r.s_
add
r=htonl(IN
ADD
R_ANY) //地址 5、
绑定
端口 6、接收数据: Receiving
Socket
,//接收端
Socket
ReceiveBuf,//接收端用来存储数据的缓冲区 BufLength,//缓冲区的大小 0,//接收的附加选项,设置为0即可 (SOCK
ADD
R*)&Sender
Add
r,//发送端的
Socket
地址 &Sender
Add
rSize//发送端
Socket
地址的大小 ) 7、关闭
socket
,关闭WSA
socket
开发中IN
ADD
R_ANY"的含义是什么?
"将sin_
add
r设置为IN
ADD
R_ANY"的含义是什么? IN
ADD
R_ANY 转换过来就是0.0.0.0,泛指本机的意思,也就是表示本机的所有IP,因为有些机子不止一块网卡,多网卡的情况下,这个就表示所有网卡ip地址的意思。 比如一台电脑有3块网卡,分别连接三个网络,那么这台电脑就有3个ip地址了,如果某个应用程序需要监听某个端口,那他要监听哪个网卡地址的端口呢? 如果
绑定
某个具体的i
IN
ADD
R_ANY有什么用?
IN
ADD
R_ANY就是inet_
add
r("0.0.0.0") 当服务器的监听地址是IN
ADD
R_ANY时,那就监听所有的哦。我的网络为:192.168.1.102. 于是就有下面的程序: 服务端: #include #include // winsock接口 #pragma comment(lib, "ws2_32.lib") // winsock实
socket
绑定
的ip为IN
ADD
R_ANY 的意义 htonl(IN
ADD
R_ANY)(0.0.0.0所有地址、不确定地址、任意地址)(htonl和htons区别)
参考文章:
socket
绑定
的ip为IN
ADD
R_ANY 的意义
socket
绑定
的ip为IN
ADD
R_ANY 的意义
socket
IN
ADD
R_ANY 监听0.0.0.0地址
socket
只
绑定
端口让路由表决定传到哪个ip 其中IN
ADD
R_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。 一般情况下,如果你要建立网络服务器,则你要通知服务器操作系统:请在某地址 xxx.xxx.xxx.xxx上的某端口 yyyy上进行侦听,并且把侦听到的数据包发
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章