>这是一个由一个参与者托管并由其他玩家加入的网络游戏.主持人自己也是一名球员.
>用户单击“主机”按钮开始在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,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广播广告.是?
解决方法
此外,它确认了以下内容:
>如果在广告商套接字上将Control.MulticastOnly设置为true,则可以使用同一主机/端口的多个套接字.
>如果广告商套接字仅进行多播,则不需要调用BindServiceNameAsync().
> 237.1.3.37和multicast range中的任何其他地址用于多播.不需要255.255.255.255,不应使用.
希望这有助于有人在路上.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。