我最近一直在使用.NET中的套接字,我想知道Socket.ExclusiveAddressUse
的实际用途是什么。我已经阅读了MSDN documentation所以我知道了基本的想法(强制一个特定的IP地址/端口组合只允许一个套接字绑定到它)但我对这个属性实际用于什么感到困惑。
文档说明ExclusiveAddressUse
为假时:
如果多个套接字尝试使用
Bind(EndPoint)
方法绑定到特定端口,则具有更具体IP地址的套接字将处理发送到该端口的网络流量。
一个IPEndPoint
(我能找到的EndPoint
的唯一具体子类)究竟是多么具体而不是另一个?如何以及为什么在应用程序中使用此行为?为什么这种行为在Windows XP之后的版本中是默认的,而不是之前的?
答案 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的瞬态连接)。