要求 (无法修改)
我有一个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);
答案 0 :(得分:1)
一种选择是切换到广播/多播设计。这是允许同一数据报转到多个套接字的唯一直接方法。
或者,转到主/客户端设计。尝试绑定到端口。如果可以,那很好,你就是主人。如果你失败了,看看是否有主人并连接到它。
为主服务器选择第二个端口以用于与客户端通信。遵循这个逻辑。
尝试打开端口。如果你成功了,你就是主人。还要听主端口。
如果失败,请打开随机端口。向主服务器发送“注册客户端”数据报。
主设备必须在主/客户端端口上侦听“注册客户端”数据报。如果它收到一个,它应该将源IP和端口添加到其客户端列表中。它必须将它在主端口上收到的所有数据报重复到每个客户端。
非主人应该以定义的间隔重复“注册客户端”数据报。主服务器应该删除任何未发送“寄存器客户端”数据报足够长的客户端,比如定义的间隔的两倍。
一个丑陋的一点 - 如果主人可能退出,一些客户将不得不提升自己掌握。如果您可以在机器上运行它,您可能只想使用专用主机。