Opciones de sockets

De ChuWiki

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.