sockets - tipos - ¿Cómo enlazar a cualquier puerto disponible?
tipos de sockets (3)
Me falta algo, ¿por qué no usas el socket udp para enviar datos? Comience con sendto y luego use la función recvfrom para leer los datos entrantes; también obtiene como bonificación la dirección desde la cual se enviaron los datos, allí mismo para que envíe una respuesta.
Necesito una aplicación que envíe un paquete UDP a un servidor de red y reciba la respuesta. El servidor responde al mismo número de puerto de donde vino la solicitud, así que primero necesito vincular () mi socket a cualquier número de puerto UDP.
La codificación rígida del número de puerto UDP es una mala idea, ya que podría ser utilizada por cualquier otra aplicación que se ejecute en la misma PC.
¿Hay alguna manera de vincular un socket UDP a cualquier puerto disponible? OMI debe ser una forma efectiva de obtener rápidamente un número de puerto libre, que es utilizado, por ejemplo, por la función accept ().
Si no, ¿cuál es la mejor estrategia para probar el enlace y comprobar el estado de WSAEADDRINUSE / EADDRINUSE: pruebe los puertos de forma secuencial a partir de 1025, o 1025 + rand (), o de algún otro modo?
Otra opción es especificar el puerto 0 para bind()
. Eso le permitirá vincularse a una dirección IP específica (en caso de que tenga múltiples instalados) mientras aún enlaza a un puerto aleatorio. Si necesita saber qué puerto fue elegido, puede usar getsockname()
después de que se haya realizado el enlace.
Llamar a sendto
sin llamar a bind
primero, el socket se vinculará automáticamente (a un puerto libre).