2011-07-12 10 views
6

Estoy escribiendo un cliente UDP y necesito mencionar el puerto de origen de mi paquete UDP en mis datos para enviar.Puerto de origen de cliente UDP en C?

  1. Cómo mi programa puede obtener el número de puerto aleatorio generado por kernal que el cliente udp está utilizando para enviar datos al servidor de voip. so
  2. ¿Cómo puedo especificar un puerto de origen UDP específico antes de enviar datos?

Estaré muy muy agradecido. Por favor, respondeme lo antes posible. Mi proyecto se detiene en este punto.

Respuesta

2

Debe bind(2) su socket a un puerto de su elección. Consulte también man 7 ip y man 7 udp.

+0

Didnt trabajó .. ¿Puede Gime algo de código. – shan

+0

Primero, muestre el código que no funciona y explique de qué manera no funcionó (código de error, comportamiento inesperado ...). –

7

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); 
+0

No soy capaz de resolver el problema. ¿Puede modificar algún segmento de código? – shan

Cuestiones relacionadas