在晚上度过了更好的一部分后,我无法让它发挥作用。这就是我正在做的事情:
作为首发,我下载了NetworkHelper library来研究UWP中的网络工作方式。该库提供了我分别用于UDPManager
和UDPParticipant
类的Host
和Player
个类。
图书馆也包含一个小问答游戏样本。我的架构和游戏之间唯一的重大变化是我的一个玩家需要充当主机和玩家,而示例游戏可以一次充当主机或玩家。因此,与他们不同,我需要同时监听两个DatagramSocket
个对象。
一切正常,除了(grrr ......为什么除了总是在拐角处)主机上运行的客户端无法收听广告消息。 DatagramSocket
告诉我,对于相同的网络地址(协议/主机/端口),我不能有多个用法。如果我为服务器和客户端使用不同的端口(下面是AdvertiserPort
和ListenerPort
),则没有异常,但客户端从不接收广告消息。
这是服务器(仅包括相关代码):
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
来播放广告。是
答案 0 :(得分:1)
在MS家伙的帮助下计算出来。这似乎是DatagramSocket
类中的错误。在开始从其他广告商接收多播数据之前,您需要在多播组上发送至少一条消息。作为解决方法,您可以在开始收听之前发送空消息。更多详细信息和示例代码可以在this SO post上找到(这是此问题的绝对简化版本)。
此外,它确认了以下内容:
Control.MulticastOnly
设置为true
,则可以使用同一主机/端口设置多个套接字。BindServiceNameAsync()
。237.1.3.37
以及multicast range中的任何其他地址都适用于多播。不需要255.255.255.255,不应使用。希望这可以帮助有人在路上。