Я создаю и приложение, которое подключает телефон к устройству через сокеты, пока что все хорошо, проблема в том, что на некоторых устройствах, и я тестировал на нескольких разных марках и 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 я не смог заставить его работать.
Любая помощь приветствуется!