trucos secretos phone personalizar ocultos explorar desde archivos c# asynchronous network-programming windows-phone-7.1 windows-phone

c# - secretos - ¿Cómo(realmente) cancelar una solicitud ConnectAsync en Windows Phone?



personalizar windows phone (3)

Creo

socket.Close()

debería cancelar el intento de conexión asíncrona. Puede haber algunas excepciones que deban tomarse como consecuencia.

Estoy desarrollando una aplicación de Windows Phone que se conectará a mi servidor. Hace esto usando ConnectAsync cuando presiona el botón de inicio de sesión. Pero si el servidor está caído y desea cancelar el intento de conexión, ¿qué hacer?

Aquí está el código del cliente actual completo con mi último intento de cerrar la conexión del socket. Se supone que puede implementar fácilmente un tiempo de espera una vez que sepa cómo desconectar la conexión.

private IPAddress ServerAddress = new IPAddress(0xff00ff00); //Censored my IP private int ServerPort = 13000; private Socket CurrentSocket; private SocketAsyncEventArgs CurrentSocketEventArgs; private bool Connecting = false; private void Button_Click(object sender, RoutedEventArgs e) { try { if (Connecting) { CurrentSocket.Close(); CurrentSocket.Dispose(); CurrentSocketEventArgs.Dispose(); CurrentSocket = null; CurrentSocketEventArgs = null; } UserData userdata = new UserData(); userdata.Username = usernameBox.Text; userdata.Password = passwordBox.Password; Connecting = ConnectToServer(userdata); } catch (Exception exception) { Dispatcher.BeginInvoke(() => MessageBox.Show("Error: " + exception.Message)); } } private bool ConnectToServer(UserData userdata) { CurrentSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //Create a new SocketAsyncEventArgs CurrentSocketEventArgs = new SocketAsyncEventArgs(); CurrentSocketEventArgs.RemoteEndPoint = new IPEndPoint(ServerAddress, ServerPort); CurrentSocketEventArgs.Completed += ConnectionCompleted; CurrentSocketEventArgs.UserToken = userdata; CurrentSocketEventArgs.SetBuffer(new byte[1024], 0, 1024); CurrentSocket.ConnectAsync(CurrentSocketEventArgs); return true; }

Editar: Un pensamiento que me llamó la atención es que tal vez es la computadora del servidor que se apila en las solicitudes a pesar de que el software del servidor no está activado. ¿Es eso posible?


Tu código se ve bien Como ya dijo Marc, cerrar el socket cancela todas las operaciones pendientes.

Sí, a veces es posible que conecte OK y no pase nada. Para verificar, en la línea de comando

telnet 192.168.1.44 31337 donde 192.168.1.44 es ServerAddress (el nombre también está bien) y 31337 es ServerPort. Primero puede habilitar un "cliente Telnet" usando el Panel de control / Programas y características / Activar y desactivar las características de Windows. Si ve "No se pudo abrir la conexión" = su aplicación WinForms no debería poder conectarse. Si ve una pantalla negra con cursor parpadeante = su aplicación WinForms debe conectarse correctamente.


Lo que sucede aquí es que estás especificando un buffer en el argumento de ConnectAsync.

CurrentSocketEventArgs.SetBuffer(new byte[1024], 0, 1024);

La documentación dice:

Optionally, a buffer may be provided which will atomically be sent on the socket after the ConnectAsync method succeeds.

Entonces su servidor verá la conexión y los datos a la vez. Su código de cancelación está bien, es solo que los datos se envían antes de que tenga la oportunidad de cancelar algo.