Я использую 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, он либо не работает, либо мне отказывают в разрешении. Вот несколько примеров:
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
Я проверил все брандмауэры, настройки и т. д., но дайте мне знать, что я мог пропустить.
// 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-адрес устройства.
@busssard Я использую MAUI, и на данный момент он довольно хорош и прост в использовании, единственные проблемы, которые у меня были, были с сокетами, и теперь я работаю над чтением джойстиков, чтобы я мог отправлять оси джойстика и состояния кнопок через сокеты. Как я уже упоминал ниже в ответе на вопрос, это все, что мне нужно было сделать, аудит работает отлично! Просто интересно, почему они отговорили вас от использования MAUI?
в основном отсутствует документация, меняются стандарты и тот факт, что у меня есть существующее приложение, и я не начинаю с нуля.





Я нашел ответ:
Это потому, что на Мауи на 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.
Обязательно очистите решение и после этого восстановите его! Это не сработало, пока я не сделал все вышеперечисленное!
интересно, как это получится! Я также делаю порт с использованием avalonia UI, после того как все отговаривали меня от использования MAUi