2009-02-23 12 views
13

He usado SO_REUSEADDR para tener mi servidor que se terminó para reiniciar sin quejarse de que el socket ya está en uso. Me preguntaba si hay otros usos de SO_REUSEADDR? ¿Alguien ha usado la opción de socket para otro propósito que no sea dicho?Usos de SO_REUSEADDR?

+2

Gracias, me preguntaba exactamente lo mismo. Pregunta relacionada: ¿por qué SO_REUSEADDR no es el predeterminado? –

Respuesta

20

Para TCP: el objetivo principal es reiniciar un proceso cerrado/inactivado en la misma dirección.

El indicador es necesario porque el puerto entra en un estado TIME_WAIT para garantizar que se transfieren todos los datos.

Si dos sockets están vinculados a la misma interfaz y puerto y son miembros del mismo grupo de multidifusión, los datos se entregarán a ambos sockets.

Supongo que un uso alternativo sería un ataque de seguridad para tratar de interceptar datos.

(Source)


Para UDP: SO_REUSEADDR se utiliza para multidifusión

Más de un proceso se puede unir al mismo puerto SOCK_DGRAM UDP si el bind() es precedido por:

int one = 1; setsockopt (calcetín, SOL_SOCKET, SO_REUSEADDR, & uno, sizeof (un))

En este caso, cada multidifusión entrante o datagramas UDP de difusión destinada a el puerto compartido se entrega a todos los sockets al puerto .

(Source)

+2

Se requiere aclaración. Un puerto de escucha no entra en TIME_WAIT, pero las conexiones aceptadas sí pueden. TIME_WAIT no está allí para garantizar que se transfieren todos los datos, sino para evitar confusiones con una conexión posterior entre los mismos puntos finales. – EJP

+0

¿Está sucediendo el "enlace" en el lado del remitente O en el lado del receptor (para UDP: SO_REUSEADDR)? ¿Qué sucede si el emisor y el receptor son nodos separados en la red? – Sammy

5

El otro uso principal es permitir enchufes múltiples bind() al mismo puerto de UDP. Es posible que no piense que podría aparecer, pero a veces es posible que varias aplicaciones deseen escuchar en direcciones de difusión/multidifusión con un número de puerto determinado. También permite que uno se una a la dirección del comodín, mientras que también se vincula a una dirección específica. Por ejemplo, Apache podría vincularse a *: 80 y 10.11.12.13:80