sockets - tipos - Una máquina tiene 2 NIC. ¿Cuál será utilizado cuando se conecta a un zócalo?
tipos de sockets (3)
Supongamos que creo una conexión de socket muy simple, ¿cómo puede uno programartically:
- Averigüe qué interfaz (dirección IP / NIC) se está utilizando.
- Forzar la otra interfaz
Encontrarás útiles estos enlaces, ya que la pregunta no proporciona un idioma, aquí están los más comunes.
Programación de zócalos en C #
Programación de zócalos en Java
Programación de socket en Python
Por lo tanto, use cualquiera de estos enlaces y vaya a la languge que está usando. Encuentre la función para obtener su dirección de host o dirección IP y use el método Bind para el idioma apropiado. Esto obligará a la aplicación a vincularse a esa interfaz.
Independientemente del idioma que utilice, en última instancia, estará utilizando una biblioteca de sockets en capas sobre una implementación de la biblioteca de redes C original de sockets BSD . Aunque es posible que necesite cambiar algunas cosas para diferentes bibliotecas e idiomas, la siguiente información al menos debería ser útil para identificar dónde buscar en la documentación de su biblioteca.
Servidores
Normalmente, un programa de servidor emite la siguiente secuencia de llamadas:
-
socket()
devuelve un objeto de socket "flotante". -
bind()
vincula el socket a un número de puerto conocido particular en (normalmente) todas las tarjetas de interfaz de red (NIC) en la máquina. -
listen()
hace que el socket se ponga "en vivo". -
accept()
bloques hasta que se realice una conexión desde una máquina cliente.
El punto donde puede decidir qué NIC usar es en la llamada a bind()
, que espera una estructura de datos que contenga una dirección IP y un número de puerto. La estrategia habitual es pasar el valor especial INADDR_ANY
para la dirección IP, que indica que las conexiones deben usar cualquiera y todas las NIC en la máquina, sin embargo, se puede especificar una IP de NIC particular para recibir conexiones solo a través de esa NIC.
Clientela
Normalmente, un programa de cliente emite la siguiente secuencia de llamadas:
-
socket()
devuelve un objeto de socket "flotante". -
connect()
vincula el socket a un puerto seleccionado aleatoriamente en una NIC seleccionada al azar e intenta conectarse a la combinación dehost:port
remoto especificada.
Entonces, ¿cómo puede un cliente elegir qué NIC usar? Un cliente también puede optar por llamar a bind()
si así lo desea, después de socket()
y antes de connect()
. Por lo general, esto no se hace simplemente porque connect()
automáticamente un socket desatado de forma que permita el acceso a través de cualquier NIC (que generalmente es el comportamiento deseado), pero este enlace automático se puede desactivar llamando bind()
explícitamente . En este caso, debe especificar 0 para el número de puerto para que el sistema operativo elija un número de puerto aleatorio para usted.
Una vez que se ha establecido una conexión, puede llamar a getsockname()
para obtener información sobre el socket, como a qué IP está vinculado (es decir, a qué NIC se está comunicando) y qué número de puerto se asignó (en el caso de un cliente) programa).
a. Después de establecer una conexión, la mayoría de las API de socket tienen una llamada para algo como "getLocalAddress" que le dirá la interfaz que el sistema operativo seleccionó para usted.
segundo. De manera similar, después de crear un socket pero antes de que se establezca una conexión, la mayoría de las API de socket tienen una llamada para vincular el socket a una dirección y / o puerto local.