Προς το περιεχόμενο

UDP socket C - ανάκτηση τοπικού port no


Lucky Luke

Προτεινόμενες αναρτήσεις

Δημοσ.

Κατασκευάζω μία client-server εφαρμογή κι έχω ένα πρόβλημα.

Πώς μπορώ μέσα από ένα UDP socket να πάρω εκείνο το port number που χρησιμοποιείται για να στέλνονται δεδομένα σε κάποιο άλλο endpoint;

Αρχικά λέω στο λειτουργικό να επιλέξει τυχαία port, αλλά πώς μπορώ να δω ποιο τελικά επέλεξε; Η αρχικοποιήση γίνεται κάπως έτσι:

>
client_addr.sin_family = AF_INET;
client_addr.sin_addr.s_addr = htonl(INADDR_ANY);
client_addr.sin_port = htons(0);
client_addr_len = (socklen_t)sizeof(client_addr);

bind(socket, (struct sockaddr*)&client_addr, client_addr_len);

 

Όταν πάω να καλέσω

>printf("SRC=%d\n", ntohs(client_addr.sin_port));

απλά τυπώνει 0.

 

Δεν ξέρω αν χρειάζεστε κάποια άλλη πληροφορία. Αν είναι μου λέτε. :-)

 

Υ.Γ. Το μόνο που μπορώ να κάνω για την ώρα είναι να ανακτώ μόνο το "απέναντι" port, απ' όπου λαμβάνω απάντηση, μετά την κλήση της recvfrom().

Δημοσ.

Μα απ' όσο έχω διαβάσει το 0 υποδηλώνει ότι δίνεις πάσα στο λειτουργικό να αποφασίσει ποια θα είναι η πόρτα από μία από τις διαθέσιμες. Άρα στο σημείο που κάνω bind() δε θα έπρεπε να έχει πάρει τιμή με ένα πραγματικό port number;

Δημοσ.

Η bind() δεν αποθηκεύει το port που δέσμευσε στην client_addr που της έχεις περάσει.

Για να πάρεις το τυχαίο port που έχει δεσμευθεί χρησιμοποίησε την getsockname().

 

μετά το bind() που έχεις, κάλεσε την getsockname():

>
bind(socket, (struct sockaddr*)&client_addr, client_addr_len);

sockaddr_in resultAddress;
int resultBytes=sizeof(resultAddress);

getsockname(socket,(struct sockaddr*)&resultAddress,&resultBytes);
short srcChosenPort=ntohs(resultAddress.sin_port);
printf("SRC=%d\n", srcChosenPort);

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...