Сокеты и прием трансляций не работают в приложении MAUI

Я использую Rider на Mac, и у меня возникли проблемы с невозможностью принимать трансляции на порт 15000 только в приложении MAUI. Вот некоторый код в консольном решении:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using Newtonsoft.Json; // Add this if using Newtonsoft.Json for JSON parsing

public class IFConnect
{
    private UdpClient udpClient;
    private IPEndPoint endPoint;
    private string device_ip;

    public void EstablishConnection(bool logStatus = false)
    {
        udpClient = new UdpClient(15000);
        endPoint = new IPEndPoint(IPAddress.Any, 15000);

        if (logStatus)
            Console.WriteLine("Connecting to Infinite Flight...");

        StartListening();
    }

    private void StartListening()
    {
        udpClient.BeginReceive(new AsyncCallback(OnUdpDataReceived), null);
    }

    private void OnUdpDataReceived(IAsyncResult ar)
    {
        byte[] data = udpClient.EndReceive(ar, ref endPoint);
        string receivedData = Encoding.UTF8.GetString(data);
        Console.WriteLine($"Received '{receivedData}' from {endPoint}");

        // Example processing: Parsing JSON (assuming the data is JSON-formatted)
        dynamic response = JsonConvert.DeserializeObject(receivedData);
        string addr = GetIPAddr(response.Addresses ?? response.addresses);

        Console.WriteLine(response);
        Console.WriteLine(addr);

        if (!string.IsNullOrEmpty(addr) && (response.Port != null || response.port != null))
        {
            device_ip = addr;
            // Proceed with TCP connection or any other logic here
            // ConnectAPI();
        }

        // Continue listening for the next UDP packet
        StartListening();
    }

    private string GetIPAddr(dynamic addresses)
    {
        // Add your logic to extract and return the IP address
        return addresses[0].ToString();  // Example logic
    }
}

class Program
{
    static void Main(string[] args)
    {
        IFConnect ifConnect = new IFConnect();
        ifConnect.EstablishConnection(true); // Pass 'true' to log status
        Console.ReadLine(); // Keep the console open
    }
}

который работает отлично и быстро, как и ожидалось.

Однако когда я запускаю его в приложении MAUI, либо в отдельном файле CS и использую его, либо в файле MainPage.xaml.cs, он либо не работает, либо мне отказывают в разрешении. Вот несколько примеров:

  1. Доступ запрещен:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json; // Ensure you have this package installed
using Microsoft.Maui.Controls; // Ensure you are using the correct namespace for MAUI

namespace InfiniteConnect
{
    public partial class MainPage : ContentPage
    {
        private UdpClient udpClient;
        private IPEndPoint endPoint;
        private string device_ip;

        public MainPage()
        {
            InitializeComponent();
            StartUdpClient();
        }

        private async void StartUdpClient()
        {
            try
            {
                udpClient = new UdpClient(15000);
                endPoint = new IPEndPoint(IPAddress.Any, 15000);

                // Start receiving data asynchronously
                await Task.Run(() => ListenForMessages());
            }
            catch (Exception ex)
            {
                // Handle exceptions if needed
                Console.WriteLine($"Exception: {ex.Message}");
            }
        }

        private async void ListenForMessages()
        {
            while (true)
            {
                try
                {
                    var data = await udpClient.ReceiveAsync();
                    var receivedData = Encoding.UTF8.GetString(data.Buffer);

                    // Process received data
                    await ProcessReceivedData(receivedData);
                }
                catch (Exception ex)
                {
                    // Handle exceptions if needed
                    Console.WriteLine($"Exception: {ex.Message}");
                }
            }
        }

        private async Task ProcessReceivedData(string data)
        {
            // This method should run on the main thread if it updates UI components
            await MainThread.InvokeOnMainThreadAsync(() =>
            {
                Console.WriteLine($"Received '{data}' from {endPoint}");
                dynamic response = JsonConvert.DeserializeObject(data);
                string addr = GetIPAddr(response.Addresses ?? response.addresses);

                Console.WriteLine(response);
                Console.WriteLine(addr);

                if (!string.IsNullOrEmpty(addr) && (response.Port != null || response.port != null))
                {
                    device_ip = addr;
                    // Update UI or handle connection logic here
                }
            });
        }

        private string GetIPAddr(dynamic addresses)
        {
            // Add your logic to extract and return the IP address
            return addresses[0].ToString();  // Example logic
        }
    }
}

и я просто получаю: 2024-08-19 22:22:11.728 InfiniteConnect[23296:525617] Exception: Permission denied Я проверил все брандмауэры, настройки и т. д., но дайте мне знать, что я мог пропустить.

  1. Нет ответа: ifc.cs:
// IFConnect.cs
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using Newtonsoft.Json;

public class IFConnect
{
    public class Data
    {
        public Data(dynamic data)
        {
            // Initialize your Data object with the data here
        }
    }

    private string device_ip;
    private int device_port = 15000;  // Assuming the port is 15000, set it as required
    private TcpClient tcp;
    private UdpClient udp;
    private dynamic device_info;
    private Data info;

    public string Connect(string deviceIp = null)
    {
        Console.WriteLine("Starting connection process...");

        if (string.IsNullOrEmpty(deviceIp))
        {
            Console.WriteLine("No device IP provided, discovering devices...");
            udp = new UdpClient(15000);
            IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 15000);

            while (true)
            {
                byte[] receivedBytes = udp.Receive(ref remoteEndPoint);
                if (receivedBytes != null && receivedBytes.Length > 0)
                {
                    string receivedData = Encoding.UTF8.GetString(receivedBytes);
                    device_info = JsonConvert.DeserializeObject(receivedData);
                    info = new Data(device_info);
                    device_ip = remoteEndPoint.Address.ToString();
                    Console.WriteLine($"Device found: {device_info["DeviceName"]}, IP: {device_ip}");
                    udp.Close();
                    break;
                }
            }
        }
        else
        {
            device_ip = deviceIp;
            Console.WriteLine($"Using provided device IP: {device_ip}");
        }

        try
        {
            tcp = new TcpClient();
            tcp.Connect(device_ip, device_port);
            Console.WriteLine($"Connected to Infinite Flight Connect: {device_info["DeviceName"]}, IP: {device_ip}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Failed to connect: {ex.Message}");
            return "Connection failed.";
        }

        // shutdown_tcp(); // Implement this method if needed
        return "Connected! Have a nice flight!";
    }
}

MainPage.xaml.cs:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json; // Ensure you have this package installed
using Microsoft.Maui.Controls; // Ensure you are using the correct namespace for MAUI
    
namespace InfiniteConnect
{
    public partial class MainPage : ContentPage
    {
        private UdpClient udpClient;
        private IPEndPoint endPoint;
        private string device_ip;

        public MainPage()
        {
            InitializeComponent();
            IFConnect ifc = new IFConnect();
            
            // Start the connection process
            Task.Run(() =>
            {
                string deviceIp = null;
                ifc.Connect(deviceIp);
            });
        }
    
        
    }
}

Но я просто получаю:

2024-08-19 22:23:52.746 InfiniteConnect[23399:527862] Starting connection process...
2024-08-19 22:23:52.746 InfiniteConnect[23399:527862] No device IP provided, discovering devices...

Оба они должны возвращать некоторые данные, которые я затем декодирую, но даже не пропускаю: udp = новый UdpClient(15000); через 2

Я провел много исследований по этому поводу, но ничего не поможет. Документы для получения пакетов:

Если IP-адрес устройства, к которому необходимо подключиться, неизвестен, можно обнаружить существующие устройства в той же локальной сети с помощью UDP. Мы транслируем UDP-пакеты на порт 15000, которые, среди прочего, предоставляют IP-адрес устройства.

интересно, как это получится! Я также делаю порт с использованием avalonia UI, после того как все отговаривали меня от использования MAUi

busssard 21.08.2024 09:57

@busssard Я использую MAUI, и на данный момент он довольно хорош и прост в использовании, единственные проблемы, которые у меня были, были с сокетами, и теперь я работаю над чтением джойстиков, чтобы я мог отправлять оси джойстика и состояния кнопок через сокеты. Как я уже упоминал ниже в ответе на вопрос, это все, что мне нужно было сделать, аудит работает отлично! Просто интересно, почему они отговорили вас от использования MAUI?

robinb 22.08.2024 14:01

в основном отсутствует документация, меняются стандарты и тот факт, что у меня есть существующее приложение, и я не начинаю с нуля.

busssard 22.08.2024 15:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел ответ:

Это потому, что на Мауи на Mac вам нужно редактировать файлы plist: Платформы -> Maccatalyst -> Info.plist: Добавьте это:

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

Платформы -> Maccatalyst -> Entitlements.plist:

    <key>com.apple.security.network.server</key>
    <true/>
    <key>com.apple.security.network.client</key>
    <true/>

И удалите другое логическое значение по умолчанию, которое обычно по умолчанию имеет значение true.

Обязательно очистите решение и после этого восстановите его! Это не сработало, пока я не сделал все вышеперечисленное!

Другие вопросы по теме