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

C# 在服务器和客户端位于同一台计算机上时收听广播,c#,sockets,networking,udp,uwp,C#,Sockets,Networking,Udp,Uwp,在度过了一个晚上的大部分时间后,我一直无法让它工作。以下是我正在做的: 这是一个网络游戏,由一个参与者主持,其他玩家加入。主持人自己也扮演着一名球员的角色。 用户单击主机按钮开始在UDP上发布广告。 其他用户可以查看所有可用主机的列表,并选择一个加入。 作为初学者,我下载来研究UWP中的网络是如何工作的。这个库提供了我分别用于主机类和播放器类的UDPManager和UDPParticipant类 该库还包括一个小问答游戏示例。我的架构和游戏之间唯一的主要变化是,我的一个玩家需要同时充当主机和玩家

在度过了一个晚上的大部分时间后,我一直无法让它工作。以下是我正在做的:

这是一个网络游戏,由一个参与者主持,其他玩家加入。主持人自己也扮演着一名球员的角色。 用户单击主机按钮开始在UDP上发布广告。 其他用户可以查看所有可用主机的列表,并选择一个加入。 作为初学者,我下载来研究UWP中的网络是如何工作的。这个库提供了我分别用于主机类和播放器类的UDPManager和UDPParticipant类

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

一切正常,除了grrr。。。为什么主机上运行的客户机无法收听广告消息,这一点总是指日可待。DatagramSocket告诉我,同一网络地址协议/主机/端口不能有多种用法。如果我在下面为服务器和客户端广告客户端口和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_多播_IP。对吗?我在某处读到,我需要使用255.255.255.255播放广告。是吗?

在盖伊女士的帮助下找到了答案。这似乎是DatagramSocket类中的一个bug。在开始从其他广告商接收多播数据之前,您需要在多播组上至少发送一条消息。作为一种解决方法,您可以在开始侦听之前发送一条空消息。更多细节和示例代码可以在上面找到,这是这个问题的绝对简化版本

此外,它还确认了以下几点:

如果在广告客户套接字上将Control.MulticastOnly设置为true,则可以有多个套接字使用同一主机/端口。 如果广告客户套接字只进行多播,则不需要调用BindServiceNameAsync。 237.1.3.37和工程中用于多播的任何其他地址。255.255.255.255不是必需的,不应使用。
希望这对以后的人有所帮助。

我没有答案,但我建议您的游戏广告和收听可以使用MQTT,这基本上是一种简单的轻量级“PubSub”类型的服务。它很容易配置,而且我怀疑它会更容易使用。引用:,对于C:and。问题是不能有多个连接具有相同的三项1源IP地址、2目标IP地址和3端口号。当服务器和客户端位于同一台计算机上时,通常会发生此错误,因为您正在进行两个虚拟连接。解决方案是让服务器监听IP Any地址,PC上接收到的所有IP都被转发到解决此问题的IP Any。这与Muticast无关。当两个侦听器在同一台机器上使用相同的IP和端口时,就会发生多播错误。@KeyurPATEL:谢谢链接。这听起来很有希望。我刚刚在网站上尝试了示例代码,但经常出错。MQTT_BROKER_地址是什么?@jdweng:我无法使用IPAddress。任何用于广告的地址。它抛出异常,表示找不到指定的类。@KeyurPATEL:boy。这个MQTT需要我在机器上安装一个代理服务器和一个软件服务,我认为这对于简单的p2p消息传递来说有点太多了。另外,这是一个UWP项目,所以我需要一个代理的UWP实现,我找不到。