多个Windows用户使用单个UDP端口登录

时间:2013-02-06 12:24:54

标签: c# asp.net

要求 (无法修改)

我有一个Windows窗体应用程序。当此应用程序运行时,它会侦听UDP端口。

用户可以登录到Windows并打开同一个应用程序并运行它,然后在不注销的情况下切换Windows用户并打开相同的应用程序并运行它。

问题

这两个应用程序正在使用

侦听同一端口
SocketOptionName.ReuseAddress

如此thread所示。但只有一个人可以获得数据。

问题

有一些方法可以让其他用户的应用程序读取数据吗?否则,我能以某种方式听一个通知我关于Windows用户切换的事件吗?

修改

以下是用于设置监听器的代码

IPEndPoint localEndPoint = new IPEndPoint(localAddress, listenPort);
UdpClient udpListener = new UdpClient();
udpListener.ExclusiveAddressUse = false;
udpListener.Client.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReuseAddress, true);

udpListener.Client.Bind(localEndPoint);
IPEndPoint ep = new IPEndPoint(IPAddress.Any, 0);
byte[] answer = udpListener.Receive(ref ep);

1 个答案:

答案 0 :(得分:1)

一种选择是切换到广播/多播设计。这是允许同一数据报转到多个套接字的唯一直接方法。

或者,转到主/客户端设计。尝试绑定到端口。如果可以,那很好,你就是主人。如果你失败了,看看是否有主人并连接到它。

为主服务器选择第二个端口以用于与客户端通信。遵循这个逻辑。

  1. 尝试打开端口。如果你成功了,你就是主人。还要听主端口。

  2. 如果失败,请打开随机端口。向主服务器发送“注册客户端”数据报。

  3. 主设备必须在主/客户端端口上侦听“注册客户端”数据报。如果它收到一个,它应该将源IP和端口添加到其客户端列表中。它必须将它在主端口上收到的所有数据报重复到每个客户端。

  4. 非主人应该以定义的间隔重复“注册客户端”数据报。主服务器应该删除任何未发送“寄存器客户端”数据报足够长的客户端,比如定义的间隔的两倍。

  5. 一个丑陋的一点 - 如果主人可能退出,一些客户将不得不提升自己掌握。如果您可以在机器上运行它,您可能只想使用专用主机。