Es posible que haya probado muchas funciones de C, muchas funciones de la biblioteca Posix C y funciones de C basadas en UNIX en sus programas. La mayoría de las funciones de C relacionadas con POSIX o redes usan algunas banderas en su paréntesis como argumento o utilizados para fines específicos. ¿Alguna vez has intentado aprender algunas banderas incorporadas mientras se programan?? Si no, está totalmente bien.
Discutiremos el uso de la bandera SO_REUSeaddr de C en este artículo. Es un indicador de tipo booleano entero que especifica si la reutilización de direcciones local debe ser permitida por las reglas utilizadas para validar las direcciones proporcionadas en las llamadas del sistema de enlace. Esto significa que un enchufe puede unirse para los enchufes AF_INET, salvo la presencia de un enchufe de escucha activa conectada a la dirección. No es factible vincularse al puerto especificado de un socket de audición cuando está configurado para inaddr_any para cualquier dirección local.
El método de enlace puede reutilizar la dirección local después de usar el indicador SO_REUSeaddr. Tenga en cuenta que la dirección local, que se compone de la dirección IP y el número de puerto, significa que dos direcciones locales pueden coexistir en sí mismas si alguna parte IP o número de puerto es diferente y, por lo tanto, no requiere la aplicación de este indicador. La dirección local no se puede utilizar con este parámetro si ya ha sido accedido por un socket que está en un estado de escucha a. Cuando la dirección local del socket está en el estado de escucha y el componente IP de la dirección está inaddr, todos los IP locales se controlan. El enlace ya no puede sostener ninguna dirección local para este puerto, incluso con este argumento.
Ejemplo:
Aquí está el código del cliente que se utiliza para que los clientes se conecten al servidor utilizando las dos direcciones IP separadas. El cliente en el siguiente ejemplo desea conectarse al servidor que está utilizando un número de puerto diferente pero la misma dirección IP. La dirección IP del host local y el valor del puerto se pasaron a la función Connect_TCP en la primera llamada donde se establecieron en 8888.
Sin embargo, después de unirse a la dirección local, el sistema utilizó el dominio de enchufe UNIX para realizar una segunda conexión de socket donde la dirección IP permaneció igual pero el número de puerto se cambió a 7777. Significa que un cliente está conectado a dos direcciones de socket diferentes en una sola solicitud de TCP, lo cual es concebible porque las direcciones son diferentes. Este código se vincula a la máquina dirigida después de vincular primero la dirección local. Los dos intentos de enlace deben tener éxito porque, como lo muestra el mencionado anteriormente, la parte IP de las direcciones locales de las dos conexiones de enlace varía.
Utilizando un terminal de línea de comandos de Linux, compile el código utilizando el compilador GCC para el código de idioma C:
Usando el comando ncat, imitamos el servidor:
Para ver cada estado de socket para el número de puerto 7777, use el comando SS:
La siguiente salida muestra el estado de socket para el número de puerto 7777:
Como se ve en la captura de pantalla Pevious, ahora no hay otra conexión y solo el servidor NCAT está escuchando en el puerto 7777. Después de ejecutar el archivo de salida creado en el paso de compilación, ejecutarlo.
Ahora, ejecute el mismo comando después de ejecutar el archivo de salida del código anterior en el terminal de Linux. Observe que hay dos llamadas a la conexión Connect_TCP, luego se establecen cuatro conexiones durante estas llamadas.
Ahora que dos conexiones se realizan con éxito, una usando 127.0.0.1 y puerto 7777 y el otro usando el puerto 8888, recibimos la siguiente salida. Hay cuatro conexiones en general en la siguiente pantalla porque invocamos el método Connect TCP dos veces:
Hay cuatro conexiones de estado estab (establecidas) visibles, lo cual es normal porque la salida es del lado del servidor y del lado del cliente, respectivamente. Las primeras tres líneas se escriben desde la perspectiva del servidor, mientras que las dos posteriores se presentan de la del cliente. El nombre del proceso en el fondo también muestra esto. Antes de unirse, el cliente puede conectar muchas direcciones IP locales, y el servidor puede hacer lo mismo utilizando un objetivo. Puede unirse a una variedad de direcciones locales antes de monitorear sin el argumento SO_REUSeaddr. No lo ilustraremos ahora porque el código de software es similar. El código primero une la dirección local a la dirección de destino, que es 127.0.0.1: 7777 o 127.0.0.1: 7778, y luego realice una conexión a esas direcciones IP.
Cuando ejecutamos este cliente, muestra en la pantalla la "dirección ya en uso" que indica que el primer cliente tiene esta dirección. El código anterior ahora se modifica simplemente agregando algunas líneas más del código para usar el indicador SO ReUSeaddr. Deseamos conectar a nuestro cliente a una dirección de socket similar que ya está utilizada o en poder de otro cliente. Aquí está el fragmento de código del código modificado:
Utilizamos el editor VIM para abrir el archivo y agregamos el código en el modo de inserción.
Recompilar el código. Pero antes de hacerlo, tome nota de lo siguiente: cree un archivo nuevo o utilice uno existente y modifique el nombre del archivo de salida durante la compilación. Después de la compilación, ejecute el archivo de salida utilizando el terminal de línea de comando. Después de la ejecución, podemos ver que un cliente está conectado a la misma dirección IP y número de puerto donde nuestro primer cliente estaba conectado. Esto se debe a que usamos la bandera SO_REUSeaddr.
Conclusión
Se trata del uso del parámetro SO_REUSeaddr Socket que es un indicador de tipo booleano en el idioma C. Hemos visto un ejemplo utilizando el parámetro SO_REUSeaddr Socket para especificar si la dirección local reutilizada en otros programas o subprocesos debe ser permitido por las instrucciones utilizadas para autenticar las direcciones solo si en las llamadas del sistema de enlace.