在度过了一夜的大部分时间之后,我无法使其发挥作用.这是我正在做的事情:
>这是一个由一个参与者托管并由其他玩家加入的网络游戏.主持人自己也是一名球员.
>用户单击“主机”按钮开始在UDP上做广告.
>其他用户可以看到所有可用主机的列表,并选择一个加入.
作为首发,我下载了NetworkHelper library来研究UWP中的网络工作方式.该库提供了我分别用于Host和Player类的UDPManager和UDPParticipant类.
该库还包括一个小问题/答案游戏样本.我的架构和游戏之间唯一的重大变化是我的一个玩家需要充当主机和玩家,而示例游戏可以一次充当主机或玩家.因此,与它们不同,我需要同时监听两个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广播广告.是?
最佳答案 在MS家伙的帮助下想出来了.这似乎是DatagramSocket类中的一个错误.在开始从其他广告商接收多播数据之前,您需要在多播组上发送至少一条消息.作为解决方法,您可以在开始收听之前发送空消息.更多细节和示例代码可以在
this SO post(这个问题的绝对简化版本)上找到.
此外,它确认了以下内容:
>如果在广告商套接字上将Control.MulticastOnly设置为true,则可以使用同一主机/端口的多个套接字.
>如果广告商套接字仅进行多播,则不需要调用BindServiceNameAsync().
> 237.1.3.37和multicast range中的任何其他地址用于多播.不需要255.255.255.255,不应使用.
希望这有助于有人在路上.