2010-08-09 19 views
6

Tengo una aplicación de servidor basada en Winsock que usa Windows Winsock I/O Puertos de finalización.Winsock: deje de aceptar nuevas conexiones pero mantenga la comunicación con las conexiones existentes.

Como tal, cada conexión aceptada está asociada con el puerto de escucha para comenzar a recibir notificaciones (leer, escribir, cerrar etc.).
El conector de escucha tiene un retraso de 100 conexiones pendientes.
Todo está bien.

En algún momento quiero dejar de aceptar nuevas conexiones y mantener la comunicación con los zócalos conectados ya conectados.

que pensé que podía hacer uno de:

  1. dejar de llamar WSAAccept().
  2. Establezca la acumulación de datos en cero, lo que no permite que ninguna conexión se cuelgue.
  3. Apagado de la llamada() & cierre de la tapa() en la toma de audición.

Ahora, opción # 1 da los resultados esperados; Mi aplicación no procesa las conexiones nuevas, PERO acepta hasta el monto acumulado (100). Las conexiones están prácticamente hechas, ¡no lo quiero!

Opción # 2; ¿Puedo hacer eso? ¿Cómo? No se pudo encontrar en MSDN ni en google. La documentación de listen() en MSDN dice;

Si la función de escucha se llama en una socket ya escuchar, lo hará éxito de retorno sin cambiar el valor del parámetro atraso. Al establecer el parámetro de retraso acumulado en 0 en , una llamada subsiguiente para escuchar en un socket de escucha no se considera un reinicio correcto , especialmente si hay conexiones en el zócalo.

No es bueno para mí.
Si pudiera hacerlo de una manera segura, lo combinaría con la opción n. ° 1, deteniendo efectivamente el establecimiento de cualquier conexión nueva en la máquina (¡a través del puerto de escucha!).

Opción # 3 en realidad funciona; Después de cerrar el puerto de escucha, aún puedo comunicarme con las conexiones existentes, y el retraso se ha ido (¡bien, cerró el puerto de escucha!).

Mi preocupación es que este enfoque podría tener algunos efectos secundarios. ¿Alguien puede confirmar?

Respuesta

8

Puede simplemente cerrar la toma de audición. Las conexiones aceptadas tienen sus propios zócalos y no se verán afectados al cerrar el zócalo de escucha.

Por ejemplo, en la documentación de Microsoft hay a sample server application donde se muestra el uso del socket básico. Allí se cierra la toma de audición antes de que se realice la comunicación sobre el socket aceptado (antes del do-while-loop).

+0

Sí, # 3 es la respuesta correcta. –

+0

¡Excelente respuesta!¡La "prueba" es exactamente lo que necesitaba para estar tranquilo! Ver, tenía miedo de que la asociación de la conexión recién aceptada con el socket de escucha de IOCP creara alguna dependencia. ¡Gracias de nuevo! – Poni

Cuestiones relacionadas