Socket.ExclusiveAddressUse的实际用途是什么?

时间:2011-06-24 19:28:56

标签: .net sockets binding

我最近一直在使用.NET中的套接字,我想知道Socket.ExclusiveAddressUse的实际用途是什么。我已经阅读了MSDN documentation所以我知道了基本的想法(强制一个特定的IP地址/端口组合只允许一个套接字绑定到它)但我对这个属性实际用于什么感到困惑。

文档说明ExclusiveAddressUse为假时:

  

如果多个套接字尝试使用Bind(EndPoint)方法绑定到特定端口,则具有更具体IP地址的套接字将处理发送到该端口的网络流量。

一个IPEndPoint(我能找到的EndPoint的唯一具体子类)究竟是多么具体而不是另一个?如何以及为什么在应用程序中使用此行为?为什么这种行为在Windows XP之后的版本中是默认的,而不是之前的?

1 个答案:

答案 0 :(得分:3)

例如,如果你有:

var endPoint = new IPEndPoint(IPAddress.IPv6Any, 800);
using (var socket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp))
{
    socket.Bind(endPoint);
    socket.Listen(int.MaxValue);
    socket.AcceptAsync(new SocketAsyncEventArgs().Completed += ...);
}

您将开始侦听来自端口800上所有IPv6地址的所有传入连接。现在,如果您在同一端口上创建另一个具有确切IP的套接字,则新套接字将优先并开始侦听端口上的确切IP 800.这对于较小的一组场景非常有用(例如,对于使用安全通道读/写精确IP的瞬态连接)。