Utilice bind
para vincular su socket al puerto 0, lo que le permitirá usar getsockname
para obtener el puerto. también puede vincular su socket a un puerto específico, si lo desea.
por ejemplo (suponiendo socket IPv4, sin comprobación de errores):
struct sockaddr_in sin = {};
socklen_t slen;
int sock;
short unsigned int port;
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = 0;
bind(sock, (struct sockaddr *)&sin, sizeof(sin));
/* Now bound, get the address */
slen = sizeof(sin);
getsockname(sock, (struct sockaddr *)&sin, &slen);
port = ntohs(sin.sin_port);
Alternativamente, si usted se está comunicando con un solo servidor, puede utilizar connect
en su socket UDP (que también le da el efecto secundario muy útil de permitirle usar send
en lugar de sendto
, y hacer que el socket UDP solo acepte datagramas de su par "conectado"), luego use getsockname
para obtener su puerto/dirección local. Todavía puede optar por enlazar su zócalo antes de usar connect
.
por ejemplo:
struct sockaddr_in sin = {};
socklen_t slen;
int sock;
short unsigned int port;
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
/* set sin to your target host... */
...
connect(sock, (struct sockaddr *)&sin, sizeof(sin));
/* now retrieve the address as before */
slen = sizeof(sin);
getsockname(sock, (struct sockaddr *)&sin, &slen);
port = ntohs(sin.sin_port);
Didnt trabajó .. ¿Puede Gime algo de código. – shan
Primero, muestre el código que no funciona y explique de qué manera no funcionó (código de error, comportamiento inesperado ...). –