2009-03-31 17 views
5

Mam następujący typowego kodu w C pod Linuksem, aby uzyskać dane UDP:Jak uzyskać port UDP nadawcy w 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); 

Wszystko powyższy kod działa, ale teraz mam potrzebę znalezienia się port UDP nadawcy, czy istnieje struktura lub system zadzwonić Mogę użyć, aby pobrać takie informacje, gdy otrzymam pakiet udp?

dzięki

Odpowiedz

6

recvfrom() ma wrócić do ciebie, że w piątym argumentu (struct sockaddr *).

EDIT: Zastosowanie coś takiego

struct sockaddr_in client; 

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

client.sin_port powinien być portem nadawcy.

+0

patrzę na tego argumentu przed struct sockaddr ale nie ma żadnego nadawcy port UDP informacji, chyba że jest osadzony wewnątrz sa_data. –

1

port UDP nadawca będzie przejściowy. Nie sądzę, żebyś mógł użyć tego do czegokolwiek innego niż do zgłaszania.

+0

I może nie wyraziłem się jasno, muszę wiedzieć, port UDP nadawcy, więc mogę z powrotem natychmiast wysłać dane, więc jest ok, aby być przemijające. –

+0

możesz wysyłać dane tylko do gniazda nasłuchującego nasłuchu. Jest mało prawdopodobne, że gniazdo nadawcy jest także gniazdem nasłuchującym. Jeśli potrzebujesz tego zachowania, musisz mieć odsłuchiwane gniazda udp po obu stronach. – Indy9000

11

recvfrom (skarpety, buf, PKTSZ, 0, & klient, len);

Adres gniazda nadawców jest przechowywany w zmiennej klienta Twojego kodu. Aby uzyskać dostęp do portu nadawcy użyć sockaddr_in zamiast sockaddr. Przykład:

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

Odniesienia: Beej's Guide to Network Programming i MSDN

+0

reinterpret_cast nie należy tutaj. PO poprosił o C (nie C++) – sigjuice

+0

jw - downvote aż obsady jest korygowany – Alnitak

0

Piąty argument może być rzutowany na struct sockaddr_in, i sin_port jest zdalne numer portu.

0

Dzięki chłopaki, rzucając klientowi sockaddr_in rozwiązuje mój problem i głęboko wdzięczni za szybką odpowiedź, mam nadzieję, że pewnego dnia mogę przyczynić kiedy lepiej z tych rzeczy.

+2

Contribute trochę przez zbieranie poprawną odpowiedź :) – dwc