TcpCloseSocket

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

TcpCloseSocket

Mensaje por Jonny »

Hola

Estoy haciendo una apli que conecta con un servidor para obtener datos de este.

Veo, que en Autoit 3.3.6.1 la función TcpClose ha cambiado su nombre y ahora es TcpCloseSocket. Mirando su funcionamiento en la ayuda, veo que pone que si el socket se cierra correctamente devuelve 1, mientras que si ocurre un error devuelve -1...

Además, veo, que pone que cierra los sockets creados por TcpListen y TcpAccept... ¿no cierra los sockets creados con TcpConnect? (la función que estoy usando yo para conectar como cliente a un servidor).

La cosa es, que he hecho algo así para cerrar el socket:

Código: Seleccionar todo

  $ShockClose=TcpCloseSocket($ShockConn) ;Cierra el socket.
   If $ShockClose=-1 Then Return 0 ;Si no se cierra el socket - Devuelve error.
y la función devuelve 0...
Vamos, según AutoIt, se cumple la condición que comrueba si falló el cierre del socket (estando todo correcto). Pero, lo más curioso, es, que si compruebo con un msgbox() lo que devuelve TcpCloseSocket, devuelve "true". Osea, lo que efectivamente dice la ayuda que devuelve si el socket se cierra bien. Entonces, haciendo:

Código: Seleccionar todo

  $ShockClose=TcpCloseSocket($ShockConn) ;Cierra el socket.
   If Not $ShockClose Then Return 0 ;Si no se cierra el socket.
Funciona bien, no se ejecuta la condición que comprueba si ha fallado el cierre del socket.

La pregunta es ¿TcpCloseSocket() cierra sockets creados con TcpConnect()?.

Me da lo mismo hacerlo de una forma u otra mientras funcione, pero si no va a hacer nada es tontería tener ese código ahí...

Salu2!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: TcpCloseSocket

Mensaje por Ximorro »

Yo de esto no entiendo mucho pero te digo lo que entiendo de la ayuda, por si te has liado.
No sé de donde sacas que TCPCloseSocket devuelve -1 en error, en la ayuda pone que devuelve 0. Así que en realidad te está fallando pero no lo capturas porque estás mirando un -1.

La otra cuestión tú mismo lo comentas, TCPCloseSocket sirve para cerrar el socket en el que escucha (TcpListen) y acepta (TcpAccept) conexiones EL SERVIDOR. Si haces una conexión (TCPConnect) a un socket ya existente no tienes que cerrarlo, ya lo cerrará el servidor cuando no quiera seguir escuchando.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: TcpCloseSocket

Mensaje por Jonny »

Hola

De la ayuda traducida...
Valor de Retorno

Con Éxito: Devuelve 1.
Al Fallar: Devuelve -1 y establece @error a:
@error: valor de retorno de windows API WSAGetError (ver MSDN).
Pero, debería poder cerrarse la conexión también desde el cliente, pues quizá sólo quieras hacer una consulta y no es necesario que la conexión esté activa durante la ejecución del programa. Diría, que en versiones anteriores de AutoIt TCPClose() cerraba las conexiones desde el cliente.

Normalmente los servidores te desconectan. Los http suelen hacerlo nada más entregarte el documento html que corresponda, y otro tipo de servidores normalmente lo hacen, aunque tardan algo más. Normalmente, según el tiempo de timeout que tengan configurado, pero quizá algún servidor no tenga timeout configurado...

Bueno, es quizá una tontería, lo único que puede hacer es tener una conexión activa con un servidor en caso de no funcionar.

Por cierto, me extrañó que TCPCloseSocket() devolviera -1 al fallar, pero como hay funciones que devuelven ese valor si fallan...

Salu2!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: TcpCloseSocket

Mensaje por Ximorro »

Ahora lo veo, pues igual es un error en la traducción, es que yo lo miré en la versión en inglés donde pone:
Return Value
Success: Returns 1.
Failure: Returns 0 and set @error
@error: windows API WSAGetError return value (see MSDN).
Y eso en la última versión 3.3.6.1, pero es que en la 3.3.0 que uso normalmente pone lo mismo (aunque en otras palabras), que por cierto como ves uso la versión vieja y ahí ya es TCPCloseSocket, no sé de qué versión será TCPClose, pero eso debe ser muuuu viejo.

Aunque no lo tengo claro podría ser que el socket no lo cierre el cliente. Sospecho que deberían cerrarlo los dos pero la verdad es que el que manda sobre el socket es el que lo crea, que es el servidor. Los clientes se conectan a ese socket, y es el servidor cuando decide que se acaba el servicio y deja de escuchar. Pero a ver si alguien que controle el tema nos aclara este punto.

TCPListen y TCPAccept devuelven -1 en error. Por eso hay que leer siempre la documentación de las funciones, para ver exactamente qué hacen, qué parámetros tienen y cómo devuelven los resultados y errores.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: TcpCloseSocket

Mensaje por Jonny »

:)
Vaya, eso por no usar la ayuda oficial :).

Sip, TcpClose es de versiones ... muy antiguas. 3.3.12.1, o algo así... (hace bastante que no toco sockets en Autoit).

Puede que lo que dices sobre que el servidor manda en la conexión sea así, yo creía que no, que el cliente también podía decidir cuando desconectarse, pero no estoy cien por cien seguro.

Salu2!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: TcpCloseSocket

Mensaje por Ximorro »

Bueno, no hay que despreciar el trabajo de la traducción, es una currada elogiable.
Es lógico que haya errores, nadie es perfecto. No sería mala idea que los que la usáis normalmente comuniquéis a novii y su equipo los errores encontrados, para que sea cada vez más perfecta.

Yo tengo la 3.3.0, así que la 3.3.12 es más bien del futuro, ja, ja. Será de una 3.2, pero ya te digo que la 3.3.0, que es de 2008, ya tiene TCPCloseSocket.

Yo tampoco estoy muy seguro de lo de la conexión, es posible que tengan que cerrarlo los dos. Igual te falla en otra cosa, podrías poner algo de código para que algún experto en el tema le eche un vistazo.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: TcpCloseSocket

Mensaje por Jonny »

¡ni mucho menos!. No pretendía despreciar el trabajo de las traducciones, de hecho me puse contentísimo cuando vi que había una ayuda traducida actualizada, ahora a la par que la inglesa. Y pese a ese fallo que encontré en tcpclosesocket() (que puede liar un poco pero no es de gran importancia) no he encontrado ninguno más.
Vamos, que es un gran esfuerzo y muy bien hecho.

Puf, quizá no sea esa la versión ... pensándolo, si van por la 3.3.6... la 3.3.12 como que no :).

Total, una versión antigua pero ¿tanto? Pues para mi que no tan deprisa :) pero todo es posible.

Bueno, ya dije que devolvía true y false, así, que si el valor de retorno de esta función es 0 como decías, está funcionando bien (o debería).

Salu2!
Responder