2009-03-31 8 views
5

Tengo el siguiente código típica en C bajo Linux para obtener datos UDP:¿Cómo obtengo el puerto UDP del remitente en C?

sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 
mysock.sin_family = AF_INET; 
mysock.sin_addr.s_addr = INADDR_ANY; 
mysock.sin_port = my_port; 
bind(sock, &mysock, sizeof(mysock); 
recvfrom(sock, buf, PKTSZ, 0, &client, len); 

trabaja todo el código anterior, pero ahora tengo una necesidad de averiguar el puerto UDP del remitente, es que hay una estructura o sistema de ¿Puedo usar la llamada para recuperar dicha información cuando recibo un paquete udp?

gracias

Respuesta

6

recvfrom() se supone que volver a usted en el quinto argumento (struct sockaddr *).

EDIT: usar algo como esto

struct sockaddr_in client; 

recvfrom(... (struct sockaddr*)&client ...); 

client.sin_port debe ser puerto del remitente.

+0

Miro ese argumento antes pero el struct sockaddr no tiene información de puerto udp de ningún remitente, a menos que esté incrustado dentro de sa_data. –

1

UDP El puerto del remitente sería transitorio. No creo que puedas usar eso para otra cosa que no sea para informar.

+0

Tal vez no me aclare, necesito conocer el puerto udp del remitente para poder enviar datos de vuelta inmediatamente, así que está bien ser transitorio. –

+0

solo puede enviar datos a un socket udp de escucha. Es poco probable que el zócalo de su remitente sea también un zócalo de escucha. Si necesita este comportamiento, debe tener escuchas udp sockets en ambos lados. – Indy9000

11

recvfrom (calcetín, buf, PKTSZ, 0, & cliente, len);

La dirección de socket remitentes se almacena en la variable decliente de su código. Para acceder al puerto de remitentes, utilice sockaddr_in en lugar de sockaddr. Ejemplo:

sockaddr_in client; 
int len = sizeof(client); 
recvfrom(sock, buf, PKTSZ, 0, (struct sockaddr *)&client, (socklen_t *)&len); 
int port = ntohs(client.sin_port); 

Referencias: Beej's Guide to Network Programming y MSDN

+0

reinterpret_cast no pertenece aquí. El OP solicitó C (no C++) – sigjuice

+0

ídem - voto abajo hasta que se corrija el reparto – Alnitak

0

El quinto argumento puede ser arrojado a struct sockaddr_in, y hay sin_port es el número de puerto remoto.

0

Gracias a todos, el cliente sockaddr_in resuelve mi problema y aprecio profundamente la respuesta rápida, espero que algún día pueda contribuir cuando mejore con estas cosas.

+2

Contribuya un poco al elegir una respuesta correcta :) – dwc

Cuestiones relacionadas