这里是场景:我有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发送的。
我也看到通过netstat -a
此行输出的PC上(这是不能接受)
UDP [::]:50011 *.*
尽管这一切的寻找正确的,我的电脑根本没有得到OnMessageReceived
方法称为(除了神秘地工作的一个应用程序)。我应该寻找什么可以导致这种奇怪的行为?我试图改变工作应用程序上的端口,看看它是否会失败,但没有。我也尝试在不同的平板电脑上运行该应用,以查看它是否仅仅是这台PC,但是我在其他平板电脑上获得了相同的结果。该应用程序可能无法加入多播组?由于方法返回void
,我怎么知道?