2014-01-24 38 views
2

这里是场景:我有5个应用程序共享一个包含我写的P2P网络功能的常见DLL。其中一个应用程序每次都能很好地工作,但其他应用程序会遇到以下问题:通过WinRT可以在UDP多播中解释这种行为?

在多播广播中,基于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方法更加可靠。我多次查看配置文件,并获取无线LAN配置文件,这对两者都是正确的。

在这种情况下(非工作),平板电脑的发送端口是50011,其接收端口是50010.多播地址是ff02 :: fb(我也试过IPv4,没有改变)在这种情况下,PC是相反的。我确认这些数据包是通过Wireshark发送的。

Wireshark Output

我也看到通过netstat -a此行输出的PC上(这是不能接受)

UDP  [::]:50011  *.*

尽管这一切的寻找正确的,我的电脑根本没有得到OnMessageReceived方法称为(除了神秘地工作的一个应用程序)。我应该寻找什么可以导致这种奇怪的行为?我试图改变工作应用程序上的端口,看看它是否会失败,但没有。我也尝试在不同的平板电脑上运行该应用,以查看它是否仅仅是这台PC,但是我在其他平板电脑上获得了相同的结果。该应用程序可能无法加入多播组?由于方法返回void,我怎么知道?

回答

0

经过几天我的头撞墙,我终于得到了答案。如果遇到此问题,请转到Windows防火墙设置并检查连接到的网络类型。就我而言,Wi-Fi是一个访客/公共网络。显然这意味着它被Windows运行时认为是“互联网”,而不是“专用网络”。在Package.appxmanifest中,我选择了“专用网络(客户端和服务器)”选项,但只有“Internet(客户端)”(仅提供出站访问)而不是“Internet(客户端和服务器)”那是因为某种原因而工作的。

请注意:这并不能解释为什么一台x86平板电脑仍然可以接收所有应用程序。我只能假设这是某种驱动程序缺陷。

这应该会触发某种警告信息,因为这个简单的设置太容易忽略了。

相关问题