2009-03-31 2 views
5

Je le code typique suivant en C sous Linux pour obtenir des données UDP:Comment puis-je obtenir le port UDP de l'expéditeur 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); 

Tout le code ci-dessus fonctionne, mais maintenant j'ai besoin de trouver le port udp de l'expéditeur, est-il une structure ou d'un système appel que je peux utiliser pour récupérer ces informations quand je reçois un paquet udp?

grâce

Répondre

6

recvfrom() est censé vous revenir que dans le cinquième argument (struct sockaddr *).

EDIT: Utilisez quelque chose comme ça

struct sockaddr_in client; 

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

client.sin_port devrait être le port de l'expéditeur.

+0

Je regarde cet argument avant, mais la structure sockaddr n'a pas d'informations sur le port udp de l'expéditeur, sauf si elle est incorporée dans la sa_data. –

1

Le port de l'expéditeur UDP serait transitoire. Je ne pense pas que vous pourriez utiliser cela pour autre chose que pour signaler.

+0

Je ne suis peut-être pas clair, j'ai besoin de connaître le port udp de l'expéditeur afin que je puisse renvoyer les données immédiatement, donc je peux être transitoire. –

+0

vous pouvez seulement envoyer des données à une prise d'écoute udp. Il est peu probable que votre socket émetteur soit également une socket d'écoute. Si vous avez besoin de ce comportement, vous devez écouter les sockets udp des deux côtés. – Indy9000

11

recvfrom (chaussette, buf, PKTSZ, 0, & client, len);

L'adresse de l'expéditeur socket est stocké dans la variable client de votre code. Pour accéder au port des expéditeurs, utilisez sockaddr_in au lieu de sockaddr. Exemple:

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

Références: Beej's Guide to Network Programming et MSDN

+0

reinterpret_cast n'appartient pas ici. L'OP a demandé C (pas C++) – sigjuice

+0

ditto - downvote jusqu'à ce que la distribution soit corrigée – Alnitak

0

Le cinquième argument peut être coulé à struct sockaddr_in, et il sin_port est le numéro de port distant.

0

Merci les gars, en jetant le client à sockaddr_in résout mon problème et j'apprécie profondément pour la réponse rapide, j'espère un jour je peux contribuer quand je vais mieux avec ce genre de choses.

+2

Contribuer un peu en choisissant une réponse correcte :) – dwc