同一个SOCKET可以bind多个IP么?

明天去抢劫 2013-01-11 01:22:23
主机A有3个IP,我想让Server程序在其中两个IP实现listen,怎么实现?

一个Socket是不是只能调用bind一次?
...全文
2197 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
jimette 2013-01-14
  • 打赏
  • 举报
回复
学习
medal2004 2013-01-14
  • 打赏
  • 举报
回复
绑定ADDR_ANY,accept是必须的,accept之后判断若是第三块网卡的地址段就断开。
Squall_zy 2013-01-14
  • 打赏
  • 举报
回复
引用 16 楼 microsoftwin 的回复:
我不是要求所有的IP都可以实现LISTEN,比如我开启一个DHCP服务,只希望其中的两块网卡响应,第三块网卡不响,每个网卡一个IP,所以我希望其中的两个IP开启LISTEN
TCP是传输层的东西,和网卡一点关系也没有。 一个socket只能bind一次,不同socket竞争的是端口资源,而非IP资源。 看来是我对你的问题理解错了。我上面说的内容,能看懂的看一下,看不懂的就当我没说吧。
w_xei 2013-01-13
  • 打赏
  • 举报
回复
学习了
明天去抢劫 2013-01-13
  • 打赏
  • 举报
回复
我不是要求所有的IP都可以实现LISTEN,比如我开启一个DHCP服务,只希望其中的两块网卡响应,第三块网卡不响,每个网卡一个IP,所以我希望其中的两个IP开启LISTEN
wyx100 2013-01-11
  • 打赏
  • 举报
回复
创建2个socket来listen就好了,1个socket肯定不可以绑定2个IP的。
Eleven 2013-01-11
  • 打赏
  • 举报
回复
引用 楼主 microsoftwin 的回复:
本帖最后由 microsoftwin 于 2013-01-11 01:26:19 编辑主机A有3个IP,我想让Server程序在其中两个IP实现listen,怎么实现? 一个Socket是不是只能调用bind一次?
最好是bind到不同的端口上
sumos 2013-01-11
  • 打赏
  • 举报
回复
引用 4 楼 Squall_zy 的回复:
引用 3 楼 zzz_zou 的回复:创建2个socket来listen就好了,1个socket肯定不可以绑定2个IP的。 我印象中,socket只能和一个端口绑定,IP地址好像没限制。 INADDR_ANY好像就是不关心IP。 假设我开个UDP接收端口,任何网段的UDP包,只要发给该端口,都能收到。 TCP也应该是这样吧。。
是的,ADDR_ANY
Squall_zy 2013-01-11
  • 打赏
  • 举报
回复
引用 3 楼 zzz_zou 的回复:
创建2个socket来listen就好了,1个socket肯定不可以绑定2个IP的。
我印象中,socket只能和一个端口绑定,IP地址好像没限制。 INADDR_ANY好像就是不关心IP。 假设我开个UDP接收端口,任何网段的UDP包,只要发给该端口,都能收到。 TCP也应该是这样吧。。
zzz_zou 2013-01-11
  • 打赏
  • 举报
回复
创建2个socket来listen就好了,1个socket肯定不可以绑定2个IP的。
这不是鸭头 2013-01-11
  • 打赏
  • 举报
回复
建议楼主bind其中2个IP地址试试结果。
傻X 2013-01-11
  • 打赏
  • 举报
回复
一个程序可以建3个线程,3个Socket,每个线程监听一个不就行了?
Squall_zy 2013-01-11
  • 打赏
  • 举报
回复
用实验和事实来说话。

服务器设定了3个IP地址。a类地址一个,b类地址一个,c类地址一个。如图:


客户端也设定3个IP地址,同样a类、b类、c类各一个。
用网络调试工具进行tcp的连接。如图:


结论:
不同IP地址连接服务器同一端口,均能连接成功,并且收发数据正常。
UDP操作同理。
ls443085074 2013-01-11
  • 打赏
  • 举报
回复
1个socket只能监听一个IP
Squall_zy 2013-01-11
  • 打赏
  • 举报
回复
引用 11 楼 zzz_zou 的回复:
INADDR_ANY 这个是指0.0.0.0 你开个UDP端口号,在局域网内别人是广播或者组播(你要在这个组播组内)的话你才可以收到。
去做下实验,应该是可以的。无论是UDP还是TCP。UDP可以是非广播和非组播报文。
Squall_zy 2013-01-11
  • 打赏
  • 举报
回复
引用 8 楼 microsoftwin 的回复:
我bind二次,第二次会返回10022错误,不管是换Port还是IP都一样,所以我觉得一个Socket只能bind一次,ADDR_ANY是所有的IP都有效,但是其中一个IP不能listen,只能建立一个SOCKET数组实现listen
你连续bind两次当然会报错。 所谓能绑定多个IP,是指使用ADDR_ANY和端口3000来进行bind。这是如果你机器配置了多个IP地址(多个网段),那么不同网段发过来的连接,都能被accept在3000端口上。 这个我刚刚做了实验,确认是可以的。
zzz_zou 2013-01-11
  • 打赏
  • 举报
回复
INADDR_ANY 这个是指0.0.0.0 你开个UDP端口号,在局域网内别人是广播或者组播(你要在这个组播组内)的话你才可以收到。
luawkk 2013-01-11
  • 打赏
  • 举报
回复
试试吧 我记得在同一个地址下可以绑定多个端口的 不过么样设计过 一般都是 2 个意思 socket 呵呵
这不是鸭头 2013-01-11
  • 打赏
  • 举报
回复
引用 8 楼 microsoftwin 的回复:
我bind二次,第二次会返回10022错误,不管是换Port还是IP都一样,所以我觉得一个Socket只能bind一次,ADDR_ANY是所有的IP都有效,但是其中一个IP不能listen,只能建立一个SOCKET数组实现listen
那说明同一个socket不能绑定在2个IP或者2个端口上。 所以你只能创建2个socket,并分别绑定在两个IP地址上。
明天去抢劫 2013-01-11
  • 打赏
  • 举报
回复
我bind二次,第二次会返回10022错误,不管是换Port还是IP都一样,所以我觉得一个Socket只能bind一次,ADDR_ANY是所有的IP都有效,但是其中一个IP不能listen,只能建立一个SOCKET数组实现listen

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧