多个windows用户使用单个UDP端口登录
本文关键字:UDP 登录 单个 windows 用户 多个 | 更新日期: 2023-09-27 17:57:51
需求 (无法修改)
我有一个windows窗体应用程序。当这个应用程序运行时,它会监听UDP端口。
用户可以登录到windows并打开相同的应用程序并运行它,然后在不注销的情况下切换windows用户,打开相同的程序并运行。
问题
这两个应用程序正在使用侦听同一端口
SocketOptionName.ReuseAddress
如本线程中所示。但只有一个人能得到数据。
问题
有某种方法可以让另一个用户的应用程序读取数据?。否则,我能以某种方式监听一个通知我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);
一个选项是切换到广播/多播设计。这是允许同一数据报到达多个套接字的唯一直接方法。
或者,转到主/客户端设计。试着绑定到端口。如果可以的话,太好了,你就是大师。如果你失败了,看看是否有主机并连接到它。
选择主机用于与客户端通信的第二个端口。遵循这个逻辑。
-
试着打开端口。如果你成功了,你就是主人。同时监听主端口。
-
如果失败,打开一个随机端口。向主机发送一个"注册客户端"数据报。
-
主机必须侦听主机/客户端端口上的"注册客户端"数据报。如果接收到数据报,则应将源IP和端口添加到其客户端列表中。它必须将它在主端口上接收到的所有数据报重复到它的每个客户端。
-
非主机应按规定的间隔重复"注册客户端"数据报。主机应该丢弃任何在足够长的时间内没有发送"注册客户端"数据报的客户端,比如说两倍于定义的间隔。
一个丑陋的地方——如果master可能退出,一些客户端将不得不将自己提升为master。如果你能在机器上运行,你可能只想使用一个专用的主机。