我正在创建并通过插座将电话连接到设备的App,到目前为止,问题是在某些设备上,并且我在一些不同的品牌和APIS上进行了测试,插座没有连接。我已经尝试了同步连接和异步连接,在sync方法上,异常是“在非阻塞套接字上运行会阻塞”错误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);
}
同样,在所有我测试过同步方法的三星设备上都可以正常工作(我没有测试过异步方法,因为我不需要数据交换来保持异步)。并且在API 24下的Motorola设备上也可以使用,在24(> =)之上的版本上会引发异常。在所有经过测试的华硕设备上,我无法正常工作。
欢迎任何帮助!