Я создал тестовый проект Xamarin.Forms, приложение с вкладками, с поддержкой iOS, Android и UWP. Приложение со стандартным начальным кодом создает и работает правильно на всех 3 платформах.
Am пытается проверить прием широковещательной передачи UDP в приложении . Широковещательная рассылка UDP отправляется с другой машины на том же su bnet (проверили широковещательную рассылку с другой машины и с той же машины, результаты совпадают). Если на этом компьютере я запустил автономный неуправляемый инструмент тестирования прослушивателя UDP (тот, который мы написали для себя), я смогу увидеть все сообщения, поступающие с другого компьютера.
Я добавил код (показанный ниже) в Проект Xamarin.Forms и запуск сборки UWP на этом компьютере. Что я вижу, так это то, что в выходных данных отладки я получаю сообщение "начал получать", а затем ничего больше. На самом деле я не получаю сообщения (или, по крайней мере, обратный вызов не вызывается) , Я проверил netstat и вижу, что когда мое приложение Xamarin.Forms работает, оно привязано к указанному порту UDP. Но мой OnUdpDataReceived никогда не вызывается .
РЕДАКТИРОВАТЬ: Я дважды щелкнул файл Package.appxmanifest проекта UWP в обозревателе решений. который вызвал пользовательский интерфейс, и в этом я проверил «Capabilities >> Inte rnet (Client & Server)», думая, что это было разрешением, но это не помогло.
EDIT: Я проверил подключение , создав два консольных проекта: отправителя и получателя. Отправитель просто зацикливается, отправляя тестовую широковещательную рассылку UDP каждую секунду Приемник использует тот же код, показанный здесь. Эти проекты работают как положено. Таким образом, тот же код получателя работает в консольном проекте, но не в проекте Xamarin.Forms.
Во-первых, простой класс получателя UDP.
public class BaseUdpReceiver
{
private UdpClient _udpClient;
public BaseUdpReceiver()
{
}
public void Start()
{
_udpClient = new UdpClient()
{
ExclusiveAddressUse = false,
EnableBroadcast = true
};
_udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
_udpClient.Client.Bind(new IPEndPoint(IPAddress.Any, Constants.Network.SOME_CONSTANT_PORT_INTEGER));
_udpClient.BeginReceive(OnUdpDataReceived, _udpClient);
Debug.WriteLine($">>> started receiving");
}
private static void OnUdpDataReceived(IAsyncResult result)
{
Debug.WriteLine($">>> in receive");
var udpClient = result.AsyncState as UdpClient;
if (udpClient == null)
return;
IPEndPoint remoteAddr = null;
var recvBuffer = udpClient.EndReceive(result, ref remoteAddr);
Debug.WriteLine($"MESSAGE FROM: {remoteAddr.Address}:{remoteAddr.Port}, MESSAGE SIZE: {recvBuffer?.Length ?? 0}");
udpClient.BeginReceive(OnUdpDataReceived, udpClient);
}
}
Затем код в App.xaml.cs, который использует этот класс.
public partial class App : Application
{
private BaseUdpReceiver _udpReceiver;
public App()
{
InitializeComponent();
DependencyService.Register<MockDataStore>();
MainPage = new MainPage();
_udpReceiver = new BaseUdpReceiver();
_udpReceiver.Start();
}
protected override void OnStart()
{
}
protected override void OnSleep()
{
}
protected override void OnResume()
{
}
}
информация о версии
Visual Studio 2019 Enterprise v16.4.5
Xamarin 16.4.000.322 (d16-4@ddfd842)
Windows 10 64-bit v1909 (OS Build 18363.657)
Microsoft.NETCore.UniversalWindowsPlatform, v6.2.9
NETStandard.Library, v2.0.3
Xamarin.Essentials, v1.5.0
Xamarin.Forms, v4.5.0.356