每个套接字地址(proto / ip / port)仅使用一种

KGC*_*beX 2 c# sockets networking

大家好

信息:

主题:组播

首先,我找到了解决方案,但我不明白为什么这是解决方案。

**范围:**(删除任何混乱/不必要的代码)

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=====
}
Run Code Online (Sandbox Code Playgroud)

问题:

我的侦听器在form_load事件上分别在线程上运行,因此它的初始化方式与我的SND_Socket相同,但是将SND_Socket.Bind()端口更改为0允许我接收这些多播数据包。

def MSDN一样,添加ExclusiveAddress不能缓解此问题(因为接收和发送套接字以相同的方式初始化)。

如果套接字仅允许一个套接字绑定到特定端口,则为true;否则为true。否则为假。对于Windows Server 2003和Windows XP Service Pack 2,默认值为true;对于所有其他版本,默认值为false。

并在备注中进一步确认:

如果ExclusiveAddressUse为false,则多个套接字可以使用Bind方法绑定到特定端口。但是,只有一个套接字可以对发送到该端口的网络流量执行操作。如果有多个套接字尝试使用Bind(EndPoint)方法绑定到特定端口,则具有更特定IP地址的套接字将处理发送到该端口的网络流量。

如果ExclusiveAddressUse为true,则无论Internet协议(IP)地址如何,第一次使用Bind方法尝试绑定到特定端口都将成功;否则,将首次使用Bind方法绑定特定端口。在原始绑定套接字被销毁之前,所有随后使用Bind方法尝试绑定到该端口的操作都将失败。

必须在调用Bind之前设置此属性。否则将抛出InvalidOperationException。

为什么做的

Socket.ExclusiveAddress =假

不允许SND_Socket以“ Listener_Socket”的形式侦听此IP和端口,此外,为什么在RCV_Socket.Bind()解决此问题时将port设置为0 ?

Pet*_*iho 5

如果没有一个好的最小,完整和可验证的示例,就不可能确切地知道您甚至遇到了什么问题,也没关系确定是什么原因。缺少这一点,一些意见/评论与所述问题有关:

  1. ExclusiveAddressUse属性不影响设置该属性的套接字,而是影响该套接字之后绑定的任何其他套接字。它可以防止任何其他套接字使用相同的端口号,即通过ReuseAddress套接字选项可以使用的端口号。
  2. ReuseAddress套接字选项影响上它的设置插座。这是允许套接字绑定到同一适配器上已绑定的其他套接字的同一端口的原因。
  3. 一个人通常不会同时使用这两个选项。您要么希望套接字配合使用,要么其中一个允许另一个套接字重用相同的端口号,要么您想要禁止任何其他套接字使用相同的端口号。
  4. 0在某些情况下,绑定到端口可以缓解滥用地址专有性选项时可能发生的问题。对于不完整的问题,我无法推断您遇到的具体问题。但是绑定到端口0会导致套接字选择唯一的端口号,这当然可以避免任何与端口号冲突的问题。
  5. 除此之外,我在您的代码中看到的最大问题是您在调用之前尝试加入多播组Bind()。您应该以相反的方式进行操作,即绑定套接字,然后加入多播组。
  6. 最有可能的是,您根本不应该使用ReuseAddress。您的套接字应具有唯一的端口号。您可以使用ExclusiveAddressUse,作为一种预防性措施,以确保您得到一个异常,如果一些代码,并试图将套接字绑定到一个已经在使用的端口。

我建议您首先仔细阅读MulticastOption Class文档页面上MSDN上示例。一旦有了使用该代码的可行示例,便可以调整代码以适合您的特定需求。