【问题标题】:Listening to broadcasts when server and client are on the same machine当服务器和客户端在同一台机器上时收听广播
【发布时间】:2016-09-29 19:01:05
【问题描述】:

在度过了大半夜之后,我无法让它工作。这是我正在做的事情:

  1. 这是一个由一个参与者主持并由其他玩家加入的网络游戏。主持人本人也是玩家。
  2. 用户单击“主机”按钮开始在 UDP 上进行广告。
  3. 其他用户可以查看所有可用主机的列表并选择一个加入。

作为初学者,我下载了NetworkHelper library 来研究网络在 UWP 中的工作原理。这个库提供了UDPManagerUDPParticipant 类,我分别用于我的HostPlayer 类。

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

一切正常,除了(grrr...为什么这个 except 总是在拐角处)运行在主机上的客户端无法收听广告消息。 DatagramSocket 告诉我不能对同一个网络地址(协议/主机/端口)进行多次使用。如果我为服务器和客户端使用不同的端口(@98​​7654331@和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 来播放广告。是吗?

【问题讨论】:

  • 我没有给你答案,而是一个建议,你的游戏(广告和收听)可以使用 MQTT,它基本上是简单的轻量级“PubSub”类型服务。它很容易配置,我怀疑它会更容易使用。参考:MQTT,对于 C#:M2Mqtt for .Net : MQTT client for Internet of Things & M2M communicationC# .Net and WinRT Client
  • 问题是你不能有多个相同的三项连接1)源IP地址,2)目标IP地址3)端口号。当您在同一台机器上同时拥有服务器和客户端时,通常会发生此错误,因为您正在建立两个虚拟连接。解决方案是让服务器侦听 IP Any 地址,PC 上接收到的所有 IP 都被转发到 IP Any,从而解决了这个问题。它与 Muticast 无关。当两个侦听器在同一台机器上使用相同的 IP 和端口时,会发生多播错误。
  • @KeyurPATEL:感谢您的链接。这听起来很有希望。我刚刚尝试了网站上的示例代码,但不断出现错误。 MQTT_BROKER_ADDRESS 是什么?
  • @jdweng:我无法使用IPAddress.Any 进行广告宣传。它抛出异常说“找不到指定的类”。
  • @KeyurPATEL:男孩。这个 MQTT 东西需要我在机器上安装一个代理服务器(一种软件服务),在我看来这对于简单的 p2p 消息传递来说有点太多了。此外,这是一个 UWP 项目,所以我需要一个代理的 UWP 实现,但我找不到。

标签: c# sockets networking udp uwp


【解决方案1】:

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

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

  1. 如果您在广告客户套接字上将Control.MulticastOnly 设置为true,则可以有多个套接字使用同一主机/端口。
  2. 如果只做多播,广告商套接字不需要调用BindServiceNameAsync()
  3. 237.1.3.37multicast range 中的任何其他地址都适用于多播。 255.255.255.255 不是必需的,也不应该使用。

希望这对未来的人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 2011-11-20
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多