Cliente/servidor y el control winsock

Desde ya.. Muchas gracias!
El problema es "simple": los clientes se conectan al servidor y a medida que lo hacen todo funciona en forma correcta: tanto en la conexión inicial como cuando el sistema esta operando.
El problema se presenta cuando un mismo cliente cierra la conexión e intenta volver a conectarse: "error dirección en uso".. Estoy convencido de cerrar la conexión del cliente en forma correcta..

1 Respuesta

Respuesta
1
Cuando realizas una conexión TCP como cliente, generalmente no importa tu puerto local (no necesitas elegirlo haciendo un bind), sin embargo el servidor si (para que los clientes sepan a que puerto conectarse).
De cualquier manera, para asegurarte que estas cerrando las conexiones (usando apis), se tiene que llamar a closesocket y Shutdown. Y cuando termines de usar sockets llamas a WSACleanup.
Pero el control Winsock de VB (en teoría) ya lo hace.
El problema es con el puerto local del servidor. Necesito que el mismo continuamente acepte nuevas conexiones: Los clientes deben apuntar siempre al mismo puerto del servidor. Entiendo que el problema que te plantee es un bug. Al menos así aparece en la ayuda del MSDN donde se sugiere que intente con la función setsockopt y el parámetro SO_REUSEADDR. Lo hice y la función me retorna 0 por lo cual entiendo que la llamada es correcta pero.. el problema persiste. Te reitero: El problema es con el puerto local del servidor (no del cliente)y se presenta cuando el cliente cierra e intenta reconectarse:"error 10048. Dirección en uso". Sinceramente si podes ayudarme te lo agradecería o, en todo caso, decime si el problema tiene, o no, solución: así no insisto en vano. Desde ya .. muchas gracias.
Ok. Entonces necesitas crear un socket inicial que solo este escuchando, y luego "pase" el socket de petición del cliente ConnectionRequest (en el control de VB) a un nuevo socket, lo más apropiado allí es crear un array de winsock dinámico.
De esa manera siempre está el primer socket escuchando, y todos los demás mantienen la conexión con cada uno de los clientes.
Muy bien. Gracias. Por el momento utilizo un array estático. El puerto inicial (q escucha)y desde su evento ConnectionRequest pasa la solicitud de conexión entrante al 1er elemento cuyo estado sea 0 (cerrado). Por ello, cuando un cliente cierra la conexión también cierro el elemento del array q manejaba dicha conexión. De esta manera, los controles alteran entre los estados 0 y 7. Ahora bien y considerando q este método funciona bien:
* Es un error utilizar un array estatico en lugar de uno dinamico? Es altamente aconsejable utilizar uno dinamico? Podrias aclararme un poco este tema?
* Por q todos los elementos (conectados) del array tienen un valor de LocalPort igual al valor LocalPort del socket inicial (el q siempre escucha)? Esto implica un error? por ultimo:
* El nro de puerto q le asigno al socket inicial es 5000. Algun problema en esto?
- Realmente como la gestión del array de sockets la realizas desde código y sabes que hay un número definido de clientes simulateamente conectados, no habría ningún problema, si lo gestionas correctamente, vamos, que daría igual.
- Mejor asigna dinámicamente el localport al primer winsock, no desde la ventana de propiedades (en diseño).
- El puerto 5000 suele estar libre, aunque si tienes alguna aplicación o servicio usándolo, te daría un error.
Esta es la lista del convenio internacional de asignación de puertos:
http://www.iana.org/assignments/port-numbers

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas