Tengo un programa de servidor de red dirigido por eventos. Este programa acepta conexiones de otros procesos en otros hosts. Puede haber muchas conexiones efímeras desde diferentes puertos en la misma IP remota.¿Usar accept() y select() al mismo tiempo?
Actualmente, tengo un bucle while(1)
que llama al accept()
y luego genera un hilo para procesar la nueva conexión. Cada conexión se cierra después de que se lee el mensaje. En el extremo remoto, la conexión se cierra después de enviar un mensaje.
quiero eliminar la sobrecarga de la creación y derribar las conexiones al almacenar en caché el FDS socket abierto. En el lado del remitente, esto es fácil; simplemente no cierro las conexiones y las mantengo cerca.
En el lado receptor, que es un poco más difícil. Sé que puedo almacenar el FD devuelto por accept()
en una estructura y escuchar los mensajes a través de todas esas tomas utilizando poll()
o select()
, pero quiero escuchar simultáneamente tanto para las nuevas conexiones a través de accept()
y escuchar en todas las conexiones almacenadas en caché.
Si utilizo dos hilos, uno de poll()
y uno en accept()
, a continuación, cuando los accept()
devuelve la llamada (se abre una nueva conexión), tengo que despertar el otro hilo en espera en el antiguo conjunto de conexiones. Sé que puedo hacer esto con una señal y pselect()
, pero todo este lío parece como demasiado trabajo para algo tan simple.
¿Hay una llamada o metodología superior que me permita al mismo tiempo manejar las nuevas conexiones que se abren y datos que son enviados en las conexiones de edad?
Hmm, esa es una condición de carrera bien conocida - el 'accept (2)' bloqueará si el cliente interrumpe el intento de conexión entre dos syscalls. * Necesita * que la toma de audio no sea bloqueante. –
Esto es correcto - se puede añadir su descriptor de archivo escucha de la '' readfds' en su seleccione() 'llamada, y' seleccionar() 'le dirá el descriptor de archivo es "legible" si tiene una conexión listo para' accept() '. @Nikolai también es correcto: la toma de escucha debe ser no bloqueante y la llamada 'accept()' está preparada para manejar 'EAGAIN'. – caf