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

时间:2016-09-26 07:27:31

标签: c# sockets networking udp uwp

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

  1. 这是一个由一位参与者主持并由其他玩家加入的网络游戏。主持人本身也是一名球员。
  2. 用户点击“主机”按钮开始在UDP上投放广告。
  3. 其他用户可以看到所有可用主机的列表,并选择一个加入。
  4. 作为首发,我下载了NetworkHelper library来研究UWP中的网络工作方式。该库提供了我分别用于UDPManagerUDPParticipant类的HostPlayer个类。

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

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

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

    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来播放广告。是

1 个答案:

答案 0 :(得分:1)

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

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

  1. 如果您在广告客户套接字上将Control.MulticastOnly设置为true,则可以使用同一主机/端口设置多个套接字。
  2. 广告商套接字如果仅进行多播,则无需调用BindServiceNameAsync()
  3. 237.1.3.37以及multicast range中的任何其他地址都适用于多播。不需要255.255.255.255,不应使用。
  4. 希望这可以帮助有人在路上。