C # Ошибка создания сокета - PullRequest
0 голосов
/ 24 июня 2018

Итак, я пытаюсь подключиться к серверу, используя сокет C #, но я столкнулся с этой ошибкой:

System.Net.Internals.SocketExceptionFactory + ExtendedSocketException: Une предварительное получение доступа к un socket de manièreinterdite par ses autorisations d'accès a été tentée 192.168.1.17:9999

(!! Извините, не знаю, как поставить visual studio на английском языке)

Вот мой код

    Socket sock;

    public MainPage()
    {
        this.InitializeComponent();
        // Initialize MyRecognizer and Load Grammar

        connectToYanaForAll("192.168.1.17", 9999);
        sendInfoToYanaSocket(sock);
        //createGrammarFromYana(sock);
        disconnectFromYana(sock);
    }

    public void sleep(long millis) { Stopwatch stopwatch = Stopwatch.StartNew();  while (true)  { if (stopwatch.ElapsedMilliseconds >= millis) { break; } }  }

    public void connectToYanaForAll(String ip, int port)
    {
        IPAddress ipAddress = IPAddress.Parse(ip); //ipHostInfo.AddressList[0];
        IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);
        // Create a TCP/IP  socket.  
        sock = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); <-- Fail at this line
        sock.Connect(remoteEP);
    }


    public void disconnectFromYana(Socket sock)
    {
        sock.Shutdown(SocketShutdown.Both);
        sock = null;
    }

    public void sendInfoToYanaSocket(Socket sock)
    {
        String infos = "{\"action\":\"client_infos\",\"type\":\"listen\",\"version\":\"2\",\"location\":\"bureau\",\"token\":\"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"}<EOF>";
        byte[] msg = Encoding.ASCII.GetBytes(infos);
        int bytesSent = sock.Send(msg);
        Debug.WriteLine(String.Join(bytesSent.ToString()," bytes sent!"));
    }

    public void createGrammarFromYana(Socket sock)
    {
        String infos = "{\"action\":\"GET_SPEECH_COMMANDS\"}<EOF>";
        byte[] msg = Encoding.ASCII.GetBytes(infos);
        int bytesSent = sock.Send(msg);
        Debug.WriteLine(String.Join(bytesSent.ToString(), " bytes sent!"));

        sleep(200);

        byte[] bytes = new byte[4096];
        int bytesRec = sock.Receive(bytes);
        Debug.WriteLine(String.Join("Received: ", bytesRec.ToString(), " bytes!"));
        Debug.WriteLine("Text = {0}",Encoding.ASCII.GetString(bytes, 0, bytesRec));
    }

Я знаю, что вам нужно право администратора для использования необработанного сокета, но я использую stream socket, поэтому я немного застрял.(Кстати, я использую Visual studio 2017) То, что я пробовал:

  • Полностью отключить брандмауэр: не работает
  • Полностью отключить антивирус: не работает
  • Чтобы использовать TcpClient client = new TcpClient(); класс: не работает

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

Согласно Google Translate, в сообщении об ошибке говорится: «Была предпринята попытка получить доступ к сокету, запрещенному его правами доступа 192.168.1.17:9999"

Таким образом, похоже, проблема с разрешением сохраняется.Может быть, в вашей системе работает брандмауэр, который разрешает только некоторые известные исходящие соединения?

0 голосов
/ 25 июня 2018

Таким образом, решение было поместить эту строку в Package.appxmanifest

<Capability Name="privateNetworkClientServer" />

В теге <Capabilities>

0 голосов
/ 24 июня 2018

Попытайтесь привязать свой сокет к конечной точке вместо подключения, а затем вызовите Listen.Надеюсь, это поможет

...