以下是该场景:我有5个应用程序,它们共享一个包含我编写的P2P网络功能的通用DLL。其中一个应用程序每次都能完美运行,但其他应用程序遇到以下问题:
在多播广播上,我们基于x86的平板电脑可以很好地发送和接收数据包,但我的x64计算机和ARM平板电脑只能发送数据包。唯一的区别是他们使用不同的端口。我认为一定是这样,并尝试切换其他应用程序使用与工作应用程序相同的端口作为测试,但这是一个禁忌。以下是处理广播系统设置的相关代码部分。
public async Task<bool> Startup() {
if (P2PNetwork.LocalUser == null || this._listenSocket != null)
return false;
ConnectionProfile connection = null;
//See note 1 below
bool gotConnection = TryGetValidNetworkConnection(out connection);
if(!gotConnection)
return false;
this._heartbeatTimer = ThreadPoolTimer.CreatePeriodicTimer(DoHeartbeat, TimeSpan.FromSeconds(10));
var socket = new DatagramSocket();
var stream = await socket.GetOutputStreamAsync(LANBroadcasting.MULTICAST_GROUP_ADDRESS, P2PNetwork.NetworkGroup.SendPort);
this._outStreamWriter = new DataWriter(stream);
this._listenSocket = new DatagramSocket();
this._listenSocket.MessageReceived += OnMessageReceived;
await this._listenSocket.BindServiceNameAsync(P2PNetwork.NetworkGroup.ReceivePort, connection.NetworkAdapter);
this._listenSocket.JoinMulticastGroup(LANBroadcasting.MULTICAST_GROUP_ADDRESS);
DoHeartbeat(HeartbeatFlags.Ping);
return true;
}
注1:所有5个应用程序之前都出现过这些症状。那时我没有任何参数使用BindServiceNameAsync
。经过广泛的研究后,我发现一个页面表明这种方法并不好,并且采用连接配置文件的Windows 8.1方法更可靠。我多次检查了配置文件,我得到了无线局域网配置文件,这对两者都是正确的。
在这种情况下(非工作)平板电脑的发送端口是50011,其接收端口是50010.多播地址是ff02 :: fb(我也试过IPv4,没有变化)这种情况下的PC是与此相反。我确认数据包是通过Wireshark发送的。
我也在PC上通过netstat -a
看到了这一行输出(无法接收)
UDP [::]:50011 *.*
尽管所有这些看起来都是正确的,但我的PC根本没有调用OnMessageReceived
方法(除了神秘工作的一个应用程序)。我应该寻找什么可以导致这种奇怪的行为?我尝试更改工作应用程序上的端口,看它是否会失败,但它没有。我也尝试在不同的平板电脑上运行该应用程序以查看它是否只是这台PC,但我在另一台平板电脑上获得了相同的结果。应用程序可能无法加入多播组吗?我怎么知道,因为该方法返回void
?
答案 0 :(得分:0)
在我的头撞墙后几天,我终于得到了答案。如果遇到此问题,请转到Windows防火墙设置并检查所连接的网络类型。就我而言,Wi-Fi是访客/公共网络。显然这意味着它被Windows运行时称为“Internet”而不是“私有网络”。在Package.appxmanifest中,我选择了“专用网络(客户端和服务器)”选项,但只有“Internet(客户端)”(仅提供出站访问)而不是“Internet(客户端和服务器)”除了一个应用程序之外的所有选项那是因为某些原因而起作用的。
侧面说明:这并不能解释为什么一台x86平板电脑仍能够为所有应用程序接收。我只能假设这是某种驱动程序缺陷。
这应该会触发某种警告信息,因为这种简单的设置太容易被忽视了。