Hola,
TLDR.
No te compliques. Las operaciones que haces en linux sobre sockets son las mismas que se hacen sobre ficheros, es decir, es un descriptor aun asi. La llamada `select` tiene sus propios medios para que pongas el timeout cuando la invocas, no hace falta ponerselo al socket. Ademas, el setsockopt que pones no hace lo que parece que quieres hacer.
No es necesario que uses sockets no bloqueantes. Los sockets no bloqueantes lo unico que hacen es no esperar a que se realiza la operacion, es decir, que si usas `read(socket, buf, size)` en el momento en el que la llamada vaya a bloquear porque tiene que esperar al otro peer entonces retorna un -1 con errno = EAGAIN o EWOULDBLOCK.
Select lo unico que hace es notificarte de que hay un evento activo en alguno de los sockets. Por ejemplo, si el socket del servidor tiene un evento, lo mas probable es que tengas que aceptar nuevas conexiones. Si el evento lo tiene un socket de un cliente, entonces es porque te esta enviando algo, por ejemplo.
A lo mejor tendrias que mirar epoll. Epoll a parte de ser mas rapido, a mi manera de ver las cosas es mas facil de usar.
TLDR.
No te compliques. Las operaciones que haces en linux sobre sockets son las mismas que se hacen sobre ficheros, es decir, es un descriptor aun asi. La llamada `select` tiene sus propios medios para que pongas el timeout cuando la invocas, no hace falta ponerselo al socket. Ademas, el setsockopt que pones no hace lo que parece que quieres hacer.
No es necesario que uses sockets no bloqueantes. Los sockets no bloqueantes lo unico que hacen es no esperar a que se realiza la operacion, es decir, que si usas `read(socket, buf, size)` en el momento en el que la llamada vaya a bloquear porque tiene que esperar al otro peer entonces retorna un -1 con errno = EAGAIN o EWOULDBLOCK.
Select lo unico que hace es notificarte de que hay un evento activo en alguno de los sockets. Por ejemplo, si el socket del servidor tiene un evento, lo mas probable es que tengas que aceptar nuevas conexiones. Si el evento lo tiene un socket de un cliente, entonces es porque te esta enviando algo, por ejemplo.
A lo mejor tendrias que mirar epoll. Epoll a parte de ser mas rapido, a mi manera de ver las cosas es mas facil de usar.