Сокет Err 10013 с приложениями платформы Uno

#c# #sockets #uno-platform

Вопрос:

У меня в сети есть Лучемет и ноутбук.

Я создал консольное приложение для включения/выключения лучемета по протоколу TCP/IP, и оно отлично работает.

Теперь мне нужен модный графический интерфейс Uno с тем же кодом, но, к моему удивлению, теперь я получаю исключение сокета:

10013: Была предпринята попытка получить доступ к сокету способом, запрещенным его правами доступа

Я гуглил 3 дня подряд и пробовал очень много вещей, в том числе

  • Настройки/выключение брандмауэра
  • Редактирование группы разрешений
  • странный код, который я просто не мог проверить. я использую приведенный ниже код Visual Studio 2019, если он кому-то нужен:

Я был бы очень признателен, если бы кто-нибудь мог мне в этом помочь.

Вот сравнение кода:

  1. Код консоли:
      using System;
     using System.Net;
     using System.Net.Sockets;
     using System.Text;
    
     namespace Test
     {
         class Programm
         {
             static void Main(String[] args)
             {
    
         Console.WriteLine("START Enter");
         Console.ReadLine();
    
         const int Port = 7142;
         const string IPv4 = "192.168.10.70";
    
    
         IPAddress ipo = IPAddress.Parse(IPv4);
         IPEndPoint ipEo = new IPEndPoint(ipo, Port);
    
         var endpoint = new IPEndPoint(ipo, Port);
         var socket = new Socket(endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
    
         Console.WriteLine("Verbindung wird Aufgebaut mit");
         Console.WriteLine("Adresse: "   IPv4);
         Console.WriteLine("Port: "   Port);
    
         try
         {
             socket.Connect(endpoint);
         }
         catch(SocketException se)
         {
    
             Console.WriteLine("Verbindung Gescheitert");
             Console.WriteLine(se.ErrorCode   ": "   se.Message);
             Console.ReadLine();
    
         }
    
    
    
         Console.WriteLine("Verbindung hergestellt");
         Console.WriteLine("Befehl senden?");
         Console.ReadLine();
         Console.WriteLine("Befehl wird gesendet");
    
    
         var networkstream = new NetworkStream(socket, true);
    
    
         var msg = "x02x01x00x00x00x03";
    
    
         var buffer = System.Text.Encoding.UTF8.GetBytes(msg);
    
    
         foreach (int i in buffer)
         {
             Console.Write("{0} ", i);
         }
    
    
         networkstream.Write(buffer, 0, buffer.Length);
    
         var response = new byte[1024];
         var bytesRead = networkstream.Read(response, 0, response.Length);
         var responseStr = System.Text.Encoding.UTF8.GetString(response);
    
         Console.WriteLine("");
         Console.WriteLine("Empfangen wurde:");
    
         foreach (int i in response)
         {
             Console.Write("{0} ", i);
         }
    
    
         Console.ReadLine();
    
    
     }
    }
    }
     
  2. Теперь код приложения UNO:
      using System;
     using System.Collections.Generic;
     using System.IO;
     using System.Linq;
     using System.Runtime.InteropServices.WindowsRuntime;
     using Windows.Foundation;
     using Windows.Foundation.Collections;
     using Windows.UI.Xaml;
     using Windows.UI.Xaml.Controls;
     using Windows.UI.Xaml.Controls.Primitives;
     using Windows.UI.Xaml.Data;
     using Windows.UI.Xaml.Input;
     using Windows.UI.Xaml.Media;
     using Windows.UI.Xaml.Navigation;
    
     using System.Text;
     using System.Net.Sockets;
     using System.Net;
    
    
     namespace Test
     { 
    
    
    
         public sealed partial class MainPage : Page
         {
    
    
             public MainPage()
             {
                 this.InitializeComponent();
    
    
    
             }
    
             public void Ein_Click(object sender, RoutedEventArgs e)
             {
         const int Port = 7142;
         const string IPv4 = "192.168.10.70";
    
    
         IPAddress ipo = IPAddress.Parse(IPv4);
         IPEndPoint ipEo = new IPEndPoint(ipo, Port);
    
         var endpoint = new IPEndPoint(ipo, Port);
         var socket = new Socket(endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
    
         try
         {
             socket.Connect(endpoint);
             System.Diagnostics.Debug.WriteLine("Verbindung Wurde aufgebaut");
             var networkstream = new NetworkStream(socket, true);
             var msg = "x02x00x00x00x00x02";
             var buffer = System.Text.Encoding.UTF8.GetBytes(msg);
             networkstream.Write(buffer, 0, buffer.Length);
             socket.Disconnect(true);
         }
         catch (SocketException se)
         {
    
    
             Testblock1.Text = se.ErrorCode   ": "   se.Message;
             System.Diagnostics.Debug.WriteLine("Verbindung Gescheitert");
             System.Diagnostics.Debug.WriteLine(se.ErrorCode   ": "   se.Message);
         }
     }
     

Ответ №1:

Похоже, вы ориентируетесь на IP-адрес локальной сети, для которого требуется специальное разрешение, объявленное в вашем проекте приложения UWP. В проекте UWP должен быть Package.appxmanifest файл. Дважды щелкните его и выберите вкладку Возможности. Затем в списке ниже установите флажок рядом с Частными сетями (Клиент и сервер).

Пакет.Проявленные возможности

Комментарии:

1. Идеально, ты мой Герой!! Это Работает! Спасибо вам и желаю отличной недели! 😀

2. Я рад, что это помогло 🙂 ! Счастливого кодирования!