0

要求 (不能修改)

我有一个 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);
4

1 回答 1

1

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

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

选择第二个端口供 master 用于与客户端通信。遵循这个逻辑。

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

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

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

  4. 非主设备应以定义的时间间隔重复“注册客户端”数据报。主机应该丢弃任何在足够长的时间内没有发送“注册客户端”数据报的客户端,比如定义间隔的两倍。

丑陋的一点——如果主人可能退出,一些客户将不得不提升自己成为主人。如果您可以在机器上运行它,您可能只想使用专用的主控器。

于 2013-02-06T13:04:35.510 回答