Según su versión editada de la pregunta, no estoy seguro de que tenga que "dejar de escuchar" o cerrar(). Dos opciones vienen a la mente:
1) Después de invocar listen(), las conexiones no son realmente aceptadas hasta que (lógicamente) llame a accept(). Puede "desconectarse" simplemente ignorando la actividad de socket y difiriendo cualquier accept() hasta que esté listo para ellos. Cualquier conexión entrante intenta atrasarse en la cola que se creó cuando el puerto se abrió en el modo de escucha. Una vez que la cola de cola de espera está llena en la pila, los intentos de conexión adicionales simplemente se dejan caer en el suelo. Cuando reanude con accept(), rápidamente dequeue la acumulación y estará listo para más conexiones.
2) Si realmente desea que el puerto parezca completamente cerrado temporalmente, puede aplicar dinámicamente el filtro de paquete de nivel kernel al puerto para evitar que los intentos de conexión entrante lleguen a la pila de red. Por ejemplo, puede usar Berkeley Packet Filter (BPF) en la mayoría de las plataformas * nix. Eso es lo que desea hacer con los paquetes entrantes que ingresan al puerto de interés utilizando las funciones de firewall de la plataforma. Esto, por supuesto, varía según la plataforma, pero es un enfoque posible.
que no dará el mismo efecto en el nivel de protocolo que no escuchar o rechazar una conexión debido a que el backlog de escucha está lleno, por lo que podría no lograr lo que Dave desea con respecto a balanceadores de carga, etc. Esto se verá como una conexión exitosa de corta duración. –
No es perfecto, pero, hasta donde yo sé, con conectores BSD no hay forma de desconectarse sin perder el zócalo, y no hay forma de enviar un cierre sin obtener primero el asa de socket para la conexión con un accept. Si esto no funciona, entonces Dave necesitará una nueva biblioteca de socket. –
Los enlaces en su respuesta están rotos. –