【发布时间】:2016-01-17 20:44:39
【问题描述】:
大家好
信息:
主题:组播
首先,我找到了解决方案,但我不明白为什么这是解决方案。
**范围:**(删除任何杂乱/不必要的代码)
new_socket()
{
//SND_LOCAL_IP = 10.0.0.30 - local network adapter's IP
//SND_MCAST_PORT = 80 port used to broadcast Multicast Packets
//_SND_LOCAL_EP = new IPEndPoint(SND_LOCAL_IP, SND_MCAST_PORT); <problem>
_SND_LOCAL_EP = new IPEndPoint(SND_LOCAL_IP, 0); <fixed>
}
init_socket()
{
_SND_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
_SND_Socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(_SND_MCAST_IP, _SND_LOCAL_IP));
_SND_Socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.ReuseAddress, true);
_SND_Socket.ExclusiveAddressUse = false;
_SND_Socket.Bind(_SND_LOCAL_EP); <<< ====== PROBLEM LINE=====
}
问题:
我的侦听器在 form_load 事件上单独运行在线程上,因此它的初始化方式与我的 SND_Socket 相同,但是将 SND_Socket.Bind() 端口更改为 0 允许我接收这些多播数据包。
正如def MSDN 所说,添加 ExclusiveAddress 不应缓解此问题(因为接收和发送套接字的初始化方式相同)。
如果 Socket 只允许一个套接字绑定到特定端口,则为 true;否则为假。 Windows Server 2003 和 Windows XP Service Pack 2 的默认值为 true,所有其他版本的默认值为 false。
进一步,在备注中证实了这一点:
如果 ExclusiveAddressUse 为 false,则多个套接字可以使用 Bind 方法绑定到特定端口;然而,只有一个套接字可以对发送到端口的网络流量执行操作。如果多个套接字尝试使用 Bind(EndPoint) 方法绑定到特定端口,则具有更具体 IP 地址的套接字将处理发送到该端口的网络流量。
如果 ExclusiveAddressUse 为真,第一次使用 Bind 方法尝试绑定到特定端口,无论 Internet 协议 (IP) 地址如何,都会成功;所有后续使用 Bind 方法尝试绑定到该端口的操作都将失败,直到原始绑定的套接字被销毁。
此属性必须在调用 Bind 之前设置;否则会抛出 InvalidOperationException。
为什么这样做
Socket.ExclusiveAddress = false
不允许SND_Socket作为“Listener_Socket”监听这个IP和端口,为什么RCV_Socket.Bind()中设置端口为0可以解决这个问题?
【问题讨论】:
-
将 ReuseAddress 错误更新为问题中的 ExclusiveAddress
标签: c# sockets networking