Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# can';无法在windows 10 UWP中从android应用程序接收UDP广播 我正在使用Xamarin.forms和.net标准2为共享代码编写UWP和Android应用程序 我正在尝试从两个应用程序发送和接收UPD boradcast,但问题是我只能从android应用程序按预期发送和接收,而UWP应用程序无法接收UDP广播数据包 我在windows上安装了wireshark,它可以接收来自这两个应用程序的所有软件包 我为我的app.uwp.exe添加了防火墙规则(允许任何网络、任何端口、任何协议、任何ip),我重新启动了电脑,我的uwp应用程序仍然无法从android应用程序接收_C#_Xamarin.forms_Uwp_Broadcast_Udpclient - Fatal编程技术网

C# can';无法在windows 10 UWP中从android应用程序接收UDP广播 我正在使用Xamarin.forms和.net标准2为共享代码编写UWP和Android应用程序 我正在尝试从两个应用程序发送和接收UPD boradcast,但问题是我只能从android应用程序按预期发送和接收,而UWP应用程序无法接收UDP广播数据包 我在windows上安装了wireshark,它可以接收来自这两个应用程序的所有软件包 我为我的app.uwp.exe添加了防火墙规则(允许任何网络、任何端口、任何协议、任何ip),我重新启动了电脑,我的uwp应用程序仍然无法从android应用程序接收

C# can';无法在windows 10 UWP中从android应用程序接收UDP广播 我正在使用Xamarin.forms和.net标准2为共享代码编写UWP和Android应用程序 我正在尝试从两个应用程序发送和接收UPD boradcast,但问题是我只能从android应用程序按预期发送和接收,而UWP应用程序无法接收UDP广播数据包 我在windows上安装了wireshark,它可以接收来自这两个应用程序的所有软件包 我为我的app.uwp.exe添加了防火墙规则(允许任何网络、任何端口、任何协议、任何ip),我重新启动了电脑,我的uwp应用程序仍然无法从android应用程序接收,c#,xamarin.forms,uwp,broadcast,udpclient,C#,Xamarin.forms,Uwp,Broadcast,Udpclient,守则: using System.Threading.Tasks; using Xamarin.Forms; using Xamarin.Forms.Xaml; using System.Net.Sockets; using System.Net; [XamlCompilation(XamlCompilationOptions.Compile)] public partial class ItemsPage : ContentPa

守则:

    using System.Threading.Tasks;
    using Xamarin.Forms;
    using Xamarin.Forms.Xaml;
    using System.Net.Sockets;
    using System.Net;    

    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class ItemsPage : ContentPage
    {
     public async static Task<String> UDP_receive()
     {
        var myUDP = new UdpClient(8888);
        myUDP.EnableBroadcast = true;            
        var myResult = await myUDP.ReceiveAsync();
        myUDP.Close();
        return Encoding.ASCII.GetString(myResult.Buffer) + " : " + myResult.RemoteEndPoint.Address.ToString();
     }

     public async static Task UDP_Send()
     {
        var myUDP = new UdpClient();
        var RequestData = Encoding.ASCII.GetBytes(DateTime.Now.ToLongTimeString());
        myUDP.EnableBroadcast = true;
        await myUDP.SendAsync(RequestData, RequestData.Length, new IPEndPoint(IPAddress.Broadcast, 8888));
        myUDP.Close();
     }
    void Button1_click(object sender, EventArgs e)
     {
        StartListen();
        StartSending();   
     }
     async Task StartListen()
     {
        Exception eXX = null;
        while (eXX == null)
        {
            try
            {
                myText.Text += Environment.NewLine + await UDP_receive();
            }
            catch (Exception ex2)
            {
                eXX = ex2;
                log(ex2);
            }
        }
     }

     async Task StartSending()
     {
        Exception eXX = null;
        while (eXX == null)
        {
            try
            {
                await MyData.UDP_Send();
                await Task.Delay(1000);
            }
            catch (Exception ex2)
            {
                eXX = ex2;
                log(ex2);
            }
        }
     } 
   }    
使用System.Threading.Tasks;
使用Xamarin.Forms;
使用Xamarin.Forms.Xaml;
使用System.Net.Sockets;
Net系统;
[XamlCompilation(XamlCompilationOptions.Compile)]
公共部分类项目页面:ContentPage
{
公共异步静态任务UDP_receive()
{
var myUDP=新的UdpClient(8888);
myUDP.EnableBroadcast=true;
var myResult=await myUDP.ReceiveAsync();
myUDP.Close();
返回Encoding.ASCII.GetString(myResult.Buffer)+“:”+myResult.RemoteEndPoint.Address.ToString();
}
公共异步静态任务UDP_Send()
{
var myUDP=新的UdpClient();
var RequestData=Encoding.ASCII.GetBytes(DateTime.Now.ToLongTimeString());
myUDP.EnableBroadcast=true;
等待myUDP.SendAsync(RequestData,RequestData.Length,新的IPEndPoint(IPAddress.Broadcast,8888));
myUDP.Close();
}
无效按钮1\u单击(对象发送者,事件参数e)
{
StartListen();
开始查找();
}
异步任务StartListen()
{
异常eXX=null;
while(eXX==null)
{
尝试
{
myText.Text+=Environment.NewLine+等待UDP_receive();
}
捕获(异常ex2)
{
eXX=ex2;
日志(ex2);
}
}
}
异步任务开始发送()
{
异常eXX=null;
while(eXX==null)
{
尝试
{
等待MyData.UDP_Send();
等待任务。延迟(1000);
}
捕获(异常ex2)
{
eXX=ex2;
日志(ex2);
}
}
} 
}    
Android输出:
上午11:57:11:192.168.1.155
上午11:57:11:192.168.1.100
上午11:57:12:192.168.1.155
上午11:57:12:192.168.1.100
上午11:57:13:192.168.1.155
上午11:57:13:192.168.1.100
..
注意:192.168.1.100是Windows PC IP

UWP输出:
上午11:57:11:192.168.1.100
上午11:57:12:192.168.1.100
上午11:57:13:192.168.1.100
上午11:57:14:192.168.1.100
上午11:57:15:192.168.1.100

....

要接收UDP广播,请尝试将创建与绑定分离。比如说,

            var myUDP = new UdpClient()
            {
                ExclusiveAddressUse = false,
                EnableBroadcast = true
            };

            IPEndPoint localIPEndPoint = new IPEndPoint(myIP.BroadcastIPAddress, 8888);
            myUDP.Client.Bind(localIPEndPoint);
根据我的经验,看起来像UdpClient(8888)这样的短形式构造函数过早地绑定了底层套接字。这将防止更改EnableBroadcast属性

另外,从一个平台到另一个平台,我发现接收广播的唯一可靠方法是使用子网的实际广播地址。如下图所示,很容易捕获这些信息

    public class BroadcastAddress
    {
        public IPAddress IPAddress { get; set; }
        public IPAddress BroadcastIPAddress { get; set; }
        public NetworkInterfaceType NetworkInterfaceType { get; set; }
    }

    public static IEnumerable<BroadcastAddress> GetBroadcastAddresses()
    {
        List<BroadcastAddress> broadcastAddresses = new List<BroadcastAddress>();

        NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
        foreach (NetworkInterface networkInterface in networkInterfaces)
        {
            if (networkInterface != null 
                && (networkInterface.NetworkInterfaceType == NetworkInterfaceType.Wireless80211
                ||  networkInterface.NetworkInterfaceType == NetworkInterfaceType.Ethernet))
            {
                IPInterfaceProperties iPInterfaceProperties = networkInterface.GetIPProperties();
                UnicastIPAddressInformationCollection unicastIPAddressInformationCollection = iPInterfaceProperties.UnicastAddresses;
                foreach (UnicastIPAddressInformation unicastIPAddressInformation in unicastIPAddressInformationCollection)
                {
                    if (unicastIPAddressInformation.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                    {
                        IPAddress broadcastIPAddress = 
                            new IPAddress(unicastIPAddressInformation.Address.Address | (UInt32.MaxValue ^ (UInt32)(unicastIPAddressInformation.IPv4Mask.Address)));

                        broadcastAddresses.Add(new BroadcastAddress()
                        {
                            IPAddress = unicastIPAddressInformation.Address,
                            BroadcastIPAddress = broadcastIPAddress,
                            NetworkInterfaceType = networkInterface.NetworkInterfaceType
                        });
                    }
                }
            }
        }

        return broadcastAddresses;
    }
公共类广播地址
{
公共IPAddress IPAddress{get;set;}
公共IP地址广播IP地址{get;set;}
公共网络接口类型NetworkInterfaceType{get;set;}
}
公共静态IEnumerable GetBroadcastAddresses()
{
列表地址=新列表();
NetworkInterface[]networkInterfaces=NetworkInterface.GetAllNetworkInterfaces();
foreach(网络接口中的网络接口)
{
if(networkInterface!=null
&&(networkInterface.NetworkInterfaceType==NetworkInterfaceType.Wireless8021
||networkInterface.NetworkInterfaceType==NetworkInterfaceType.Ethernet)
{
IPInterfaceProperties IPInterfaceProperties=networkInterface.GetIPProperties();
UnicastIPAddressInformationCollection UnicastIPAddressInformationCollection=iPInterfaceProperties.UnicastAddresses;
foreach(UnicastIPAddressInformation UnicastIPAddressInformation集合中的UnicastIPAddressInformation UnicastIPAddressInformation)
{
if(unicastIPAddressInformation.Address.AddressFamily==System.Net.Sockets.AddressFamily.InterNetwork)
{
IP地址广播IP地址=
新的IPAddress(unicastIPAddressInformation.Address.Address |(UInt32.MaxValue^(UInt32)(unicastIPAddressInformation.IPv4Mask.Address));
broadcastAddresses.Add(新的BroadcastAddress()
{
IPAddress=unicastIPAddressInformation.Address,
广播IP地址=广播IP地址,
NetworkInterfaceType=networkInterface.NetworkInterfaceType
});
}
}
}
}
返回地址;
}
当您使用移动设备时,只需使用Wireless8021广播地址即可。在笔记本电脑或工作站上,它可能会变得稍微复杂一些。这些设备可以有多个网络接口和每个接口上的多个子网。因此,返回列表的原因是。这意味着您可能需要有多个UdpClient实例,每个子网一个

这对于OP来说可能太晚了。希望这些信息能帮助其他疲惫的搜索者让广播正常工作(以及