Lucky Luke Δημοσ. 6 Μαρτίου 2010 Δημοσ. 6 Μαρτίου 2010 Κατασκευάζω μία 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().
Evgenios1 Δημοσ. 7 Μαρτίου 2010 Δημοσ. 7 Μαρτίου 2010 Αφου δηλωνεις 0 (client_addr.sin_port = htons(0); ) τι περιμενεις να σου γυρισει?
Lucky Luke Δημοσ. 7 Μαρτίου 2010 Μέλος Δημοσ. 7 Μαρτίου 2010 Μα απ' όσο έχω διαβάσει το 0 υποδηλώνει ότι δίνεις πάσα στο λειτουργικό να αποφασίσει ποια θα είναι η πόρτα από μία από τις διαθέσιμες. Άρα στο σημείο που κάνω bind() δε θα έπρεπε να έχει πάρει τιμή με ένα πραγματικό port number;
nkcc Δημοσ. 7 Μαρτίου 2010 Δημοσ. 7 Μαρτίου 2010 Η 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);
Lucky Luke Δημοσ. 7 Μαρτίου 2010 Μέλος Δημοσ. 7 Μαρτίου 2010 Σωστός! Ευχαριστώ για τη βοήθεια και καλωσόρισες.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.