Не удается подключить Socket для приложения Android в Visual Studio Xamarin - PullRequest
0 голосов
/ 07 октября 2019

Я создаю и приложение, которое подключает телефон к устройству через сокеты, пока что все хорошо, проблема в том, что на некоторых устройствах, и я тестировал на нескольких разных марках и APIS, сокет не подключается. Я пробовал синхронизировать и асинхронное соединение, в методе синхронизации исключение составляет ошибка «Операция на неблокирующем сокете заблокирует» 10035. И с помощью асинхронного метода я получаю успешное соединение на SocketAsyncEventArgs, но затем он выбрасывает соединениеошибка тайм-аута, если я пытаюсь отправить какие-либо данные.

Следуя моему методу синхронизации

private bool OpenSocket(String EnderecoIP, int Porta)
    {
        Dispositivo = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        Dispositivo.ReceiveTimeout = TimeOut;
        Dispositivo.SendTimeout = TimeOut;      
        try
        {
            Dispositivo.Blocking = false; // setting this didn't work =(
            Dispositivo.Connect(EnderecoIP, Porta);
            return Dispositivo.Connected;
        }
        catch (Exception ex)
        {                
            return Dispositivo.Connected;
        }



    }

И асинхронному методу:

internal void OpenSocketAsync(String EnderecoIP, int Porta)
    {
        SocketAsyncEventArgs connectArgs = new SocketAsyncEventArgs();
        Dispositivo = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        Dispositivo.ReceiveTimeout = TimeOut;
        Dispositivo.SendTimeout = TimeOut;

        connectArgs.UserToken = Dispositivo;
        connectArgs.RemoteEndPoint = new IPEndPoint(IPAddress.Parse(EnderecoIP), porta);

        IPEndPoint remoto = new IPEndPoint(IPAddress.Parse(EnderecoIP), porta);
        object teste = new object();
        Dispositivo.BeginConnect(remoto, new AsyncCallback(ConnectCallback1), teste);

        Dispositivo.ConnectAsync(connectArgs);

        SocketError errorCode = connectArgs.SocketError;
        if (errorCode != SocketError.Success)
        {
            throw new SocketException((Int32)errorCode);
        }
    }
    public static System.Threading.ManualResetEvent allDone = new System.Threading.ManualResetEvent(false);
    public static void ConnectCallback1(IAsyncResult ar)
    {
        allDone.Set();
        Socket s = (Socket)ar.AsyncState;
        s.EndConnect(ar);
    }

Опять же, на всех устройствах Samsung Iпроверил, что метод синхронизации работает нормально (я не тестировал де асинхронный метод, потому что мне не нужен обмен данными, чтобы быть асинхронным). И на Motorola Devices под API 24 это также работает, на версии свыше 24 (> =) выдается исключение. И на всех протестированных устройствах Asus я не смог заставить его работать.

Любая помощь приветствуется!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...