【发布时间】:2015-03-16 19:38:46
【问题描述】:
以下代码适用于管理员帐户,但对于非管理员帐户,它会打印两次成功然后抛出 System.Net.Sockets.SocketException (0x80004005):尝试以一种被其禁止的方式访问套接字访问权限。有人知道这是为什么吗?
仅供参考,这里的实际用例是多个应用程序使用相同的 PGM 地址和套接字。推送(通过多播)实时更新。这个概念证明,这不是由我们自己的库引起的。
class Program {
static void Main(string[] args) {
IPAddress ipAddr = IPAddress.Parse("239.0.0.2");
IPEndPoint end = new IPEndPoint(ipAddr, 40002);
Socket[] _sockets = new[] {
new Socket(AddressFamily.InterNetwork, SocketType.Rdm, (ProtocolType)113 ),
new Socket(AddressFamily.InterNetwork, SocketType.Rdm, (ProtocolType)113 ),
new Socket(AddressFamily.InterNetwork, SocketType.Rdm, (ProtocolType)113 )
};
foreach (var socket in _sockets)
{
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
socket.Bind(end);
Console.WriteLine("Success");
}
Console.ReadLine();
}
}
【问题讨论】:
-
为什么需要多个套接字绑定到同一个端点?对我来说似乎是多余的。也许我不明白你的意图。为什么不能只使用一个插座?产品是否使用不同的端点?此外,由于这是一个权限问题,它与您运行的平台有关。 Windows Server 可能有什么?
-
@Wug 这里发生的是我们有多个应用程序使用相同的地址。我们注意到第三个应用程序引发了这个异常。事实上,如果你运行这个程序的 3 个实例,每个实例绑定一个套接字,我会期望相同的行为。这是在 Windows 7 上运行的。
-
这可能是故意强加给非管理用户以防止滥用的限制。
标签: c# .net sockets multicast pgm-protocol