Opciones de sockets
Opciones de sockets[editar]
Una vez creado los sockets y antes de establecer la conexión, la función setsockopt() nos permite establecer una serie de opciones, que nos permiten modificar los valores por defecto.
SO_LINGER[editar]
Cuando enviamos un mensaje por un socket, si cerramos inmediatamente después, es posible que al otro lado no les de tiempo a recoger el mensaje enviado. El socket se cierra y el mensaje desaparece antes de que el receptor los reciba.
La opción SO_LINGER hace que el socket, si tiene mensajes pendientes de que en el otro lado sean recibidos, espere un tiempo antes de cerrarse. Si ponemos esta opción, podemos enviar y cerrar inmediatamente sin problemas.
SO_REUSEADDR[editar]
Cuando terminamos un programa servidor y lo rearrancamos inmediatamente, a veces se obtiene un error (un error de bind con el puerto que estemos usando). Es necesario esperar un tiempo relativamente grande antes de rearrancar el servidor. Esto se debe a que el sistema operativo tarda ese tiempo en liberar realmente el puerto que estaba atendiendo nuestro servidor.
La opción SO_REUSEADDR le indica al sistema operativo que debe reusar ese puerto, aunque todavía no haya sido realmente liberado. Con esta ocpión, podemos parar y arrancar el servidor sin esperar ningún tiempo.
SO_KEEPALIVE[editar]
Cuando un lado cierra la conexión, en el otro sólo nos enteramos si intentamos leer. Obtendremos un 0 en la función read() (el 0 significa flujo de datos/socket cerrado). Si queremos enterarnos con cualquier otra función de acceso al socket, como write(), debemos usar esta opción
SO_KEEPALIVE mantiene algo parecido a un ping interno con el otro lado del socket y lo repite cada cierto tiempo. De esta forma detecta si el otro lado se desconecta, dando un error ante cualquier intento de usar el socket de cualquier forma.