当服务器和客户端在同一台计算机上时,收听广播

在晚上度过了更好的一部分后,我无法使其发挥作用。 这是我正在做的事情:

  1. 这是一个由一个参与者托管并由其他玩家加入的网络游戏。 主持人自己也是一名球员。
  2. 用户单击“主机”按钮开始在UDP上做广告。
  3. 其他用户可以看到所有可用主机的列表,并选择一个加入。

作为入门者,我下载了NetworkHelper库来研究UWP中的网络工作方式。 该库提供了我分别用于HostPlayer类的UDPManagerUDPParticipant类。

该库还包括一个小问答游戏样本。 我的架构和游戏之间唯一的重大变化是我的一个玩家需要充当主机和玩家,而示例游戏可以一次充当主机或玩家。 因此,与它们不同,我需要同时监听两个DatagramSocket对象。

一切正常,除了(grrr ……为什么除了总是在拐角处),主机上运行的客户端无法收听广告消息。 DatagramSocket告诉我,对于相同的网络地址(协议/主机/端口),我不能有多个用法。 如果我为服务器和客户端使用不同的端口(下面是AdvertiserPortListenerPort ),则没有exception,但客户端从不接收广告消息。

这是服务器(仅包括相关代码):

 AdvertiserSocket = new DatagramSocket(); AdvertiserSocket.MessageReceived += MessageToConnectReceivedFromParticipantAsync; await AdvertiserSocket.BindServiceNameAsync(AdvertiserPort); _timer = new Timer(async state => await SendMessageAsync(), null, 0, AdvertiserInterval); 

和广告:

 private async Task SendMessageAsync() { Stream outStream = (await AdvertiserSocket.GetOutputStreamAsync(AdvertiserGroupHost, AdvertiserPort)).AsStreamForWrite(); using (var writer = new StreamWriter(outStream)) { await writer.WriteLineAsync(AdvertiserMessage); await writer.FlushAsync(); } } 

这是客户:

 _listenerSocket = new DatagramSocket(); _listenerSocket.MessageReceived += AdvertisementMessageReceivedFromManagerAsync; await _listenerSocket.BindServiceNameAsync(ListenerPort); _listenerSocket.JoinMulticastGroup(ListenerGroupHost); 

我在这做错了什么? 是否可以在同一台计算机上运行UDP广告商和监听器? 如果是,我是否每个都使用相同或不同的端口?

另外,库使用237.1.3.37作为UDP_MULTICAST_IP 。 那是对的吗? 我在某处读到了我需要使用255.255.255.255来播放广告。 是?

在MS家伙的帮助下想出来了。 这似乎是DatagramSocket类中的一个错误。 在开始从其他广告商接收多播数据之前,您需要在多播组上发送至少一条消息。 作为解决方法,您可以在开始收听之前发送空消息。 更多细节和示例代码可以在这篇SOpost上找到(这是这个问题的绝对简化版本)。

此外,它确认了以下内容:

  1. 如果在广告商套接字上将Control.MulticastOnly设置为true ,则可以使用相同的主机/端口拥有多个套接字。
  2. 如果广告商套接字仅进行多播,则不需要调用BindServiceNameAsync()
  3. 237.1.3.37和多播范围内的任何其他地址适用于多播。 不需要255.255.255.255,不应使用。

希望这可以帮助有人在路上。