sp_steve Δημοσ. 20 Νοεμβρίου 2012 Δημοσ. 20 Νοεμβρίου 2012 Γειά σας, Φτιάχνω έναν server και θέλω να περνάω μηνύματα στον client μεσω της write() ομως εχω το εξής πρόβλημα... > serv = getservbyname(pch,NULL); if ( !serv ) abort(); /* No such service! */ n = write(newsockfd,ntohs(serv->s_port),sizeof(ntohs(serv->s_port))); στην παραπάνω write δεν μπορώ να εμφανίσω τα αποτελέσματα λογω της ntohs().. Μου ζητάει να κάνω κάτι casting, τα κάνω αλλά και πάλι... Μήπως μπορεί να βοηθήσει κάποιος? Ευχαριστώ
imitheos Δημοσ. 20 Νοεμβρίου 2012 Δημοσ. 20 Νοεμβρίου 2012 Όσες παραπάνω πληροφορίες παρέχεις, τόσο καλύτερη βοήθεια θα μπορούμε να δώσουμε. Γράψε τουλάχιστον τι μήνυμα σου βγάζει Για την ώρα αυτό που μου έρχεται στο μυαλό είναι να χρησιμοποιήσεις ntohl αντί για ntohs.
sp_steve Δημοσ. 20 Νοεμβρίου 2012 Μέλος Δημοσ. 20 Νοεμβρίου 2012 Όσες παραπάνω πληροφορίες παρέχεις, τόσο καλύτερη βοήθεια θα μπορούμε να δώσουμε. Γράψε τουλάχιστον τι μήνυμα σου βγάζει Για την ώρα αυτό που μου έρχεται στο μυαλό είναι να χρησιμοποιήσεις ntohl αντί για ntohs. Μου βγάζει αυτό > προειδοποίηση: passing argument 2 of ‘write’ makes pointer from integer without a cast [enabled by default] /usr/include/unistd.h:367:16: σημείωση: expected ‘const void *’ but argument is of type ‘uint32_t’
imitheos Δημοσ. 20 Νοεμβρίου 2012 Δημοσ. 20 Νοεμβρίου 2012 Μου βγάζει αυτό > προειδοποίηση: passing argument 2 of ‘write’ makes pointer from integer without a cast [enabled by default] /usr/include/unistd.h:367:16: σημείωση: expected ‘const void *’ but argument is of type ‘uint32_t’ Σωστά Βλακεία έγραψα πριν. Αφού είχες τη γραμμή με το write ήταν αρκετό. > ssize_t write(int fd, const void *buf, size_t count); Εδώ έχουμε τη σύνταξη. Η write όπως όλες οι συναρτήσεις τέτοιου είδους περιμένει ένα δείκτη στα δεδομένα. Αντί για αυτό εσύ πέταξες κατευθείαν τα δεδομένα που θέλεις να γράψεις δηλαδή ένα integer (uint32_t) για αυτό βαράει και σου λέει ότι χρειάζεσαι δείκτη.
sp_steve Δημοσ. 20 Νοεμβρίου 2012 Μέλος Δημοσ. 20 Νοεμβρίου 2012 Σωστά Βλακεία έγραψα πριν. Αφού είχες τη γραμμή με το write ήταν αρκετό. > ssize_t write(int fd, const void *buf, size_t count); Εδώ έχουμε τη σύνταξη. Η write όπως όλες οι συναρτήσεις τέτοιου είδους περιμένει ένα δείκτη στα δεδομένα. Αντί για αυτό εσύ πέταξες κατευθείαν τα δεδομένα που θέλεις να γράψεις δηλαδή ένα integer (uint32_t) για αυτό βαράει και σου λέει ότι χρειάζεσαι δείκτη. και σε δεικτη ομως που το εκχωρώ αρχικά πάλι τα ίδια μου κάνει....
imitheos Δημοσ. 20 Νοεμβρίου 2012 Δημοσ. 20 Νοεμβρίου 2012 Δείξε αυτό το τμήμα του κώδικα με τη μορφή που έχεις δείκτη καθώς και το error που πετάει ο compiler σε αυτή τη μορφή.
sp_steve Δημοσ. 20 Νοεμβρίου 2012 Μέλος Δημοσ. 20 Νοεμβρίου 2012 Δείξε αυτό το τμήμα του κώδικα με τη μορφή που έχεις δείκτη καθώς και το error που πετάει ο compiler σε αυτή τη μορφή. > char * port = htons(serv->s_port); n = write(newsockfd,port,sizeof(port));
imitheos Δημοσ. 20 Νοεμβρίου 2012 Δημοσ. 20 Νοεμβρίου 2012 Εδώ κάνεις το ίδιο λάθος με άλλα λόγια. Χρησιμοποιείς μεν δείκτη στη write αλλά έχεις λάθος την πάνω γραμμή. Ορίζεις ένα δείκτη (και μάλιστα σε char) και του δίνεις τιμή ένα ακέραιο. > int tmp = htons(serv->s_port); write(blah, &tmp, blah); Δοκίμασες κάτι τέτοιο ?
sp_steve Δημοσ. 20 Νοεμβρίου 2012 Μέλος Δημοσ. 20 Νοεμβρίου 2012 Εδώ κάνεις το ίδιο λάθος με άλλα λόγια. Χρησιμοποιείς μεν δείκτη στη write αλλά έχεις λάθος την πάνω γραμμή. Ορίζεις ένα δείκτη (και μάλιστα σε char) και του δίνεις τιμή ένα ακέραιο. > int tmp = htons(serv->s_port); write(blah, &tmp, blah); Δοκίμασες κάτι τέτοιο ? To εκανα τώρα αλλά δεν βγάζει κάτι...θα είναι ή κενό ή σκουπίδια...
imitheos Δημοσ. 20 Νοεμβρίου 2012 Δημοσ. 20 Νοεμβρίου 2012 > % cat > zz.c << EOF #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/stat.h> #include <fcntl.h> int main(void) { int fd; int port = 80; int tmp = ntohl(port); fd = open("ztest",O_WRONLY | O_CREAT, S_IRWXU); write(fd, &tmp, sizeof(int)); close(fd); return 0; } EOF % cc -Wall -ansi -pedantic -o zz zz.c % ./zz % hexdump -C ztest 00000000 00 00 00 50 |...P| Όπως βλέπεις, γράφτηκε κανονικά ο αριθμός 80 με Big-Endian μορφή δηλαδή αυτό που του είπαμε να γράψει.
sp_steve Δημοσ. 20 Νοεμβρίου 2012 Μέλος Δημοσ. 20 Νοεμβρίου 2012 Ο κωδικας μου ειναι αυτός > n = write(newsockfd,"\nPort: ",8); int tmp = ntohl(serv->s_port); n = write(newsockfd,&tmp,sizeof(int)); και μου εμφανίζει σκουπιδια... δηλ και αυτο να κάνω > n = write(newsockfd,"\nPort: ",8); int tmp = ntohl(22); n = write(newsockfd,&tmp,sizeof(int)); παλι σκουπιδια βγαζει....
imitheos Δημοσ. 20 Νοεμβρίου 2012 Δημοσ. 20 Νοεμβρίου 2012 Αν δεν θέλεις να δώσεις κώδικα για κάποιο λόγο (πχ πρόκειται για λύση άσκησης), τότε περίμενε μήπως κάποιο άλλο παιδί σου προτείνει κάτι που μου διέφυγε.
bokarinho Δημοσ. 22 Νοεμβρίου 2012 Δημοσ. 22 Νοεμβρίου 2012 > char * port = htons(serv->s_port); n = write(newsockfd,port,sizeof(port)); Αρχικά εδώ το sizeof(port) είναι το sizeof(char*) δηλαδή ανάλογα με το σύστημα είσαι στα 4 bytes. Πρόσεξε το αυτό, μήπως θέλεις καλύτερα κάποια strlen. Επίσης η htons επιστρέφει short int, και όχι char* αλλά αλήθεια γιατί τα κάνεις όλα αυτά; Προφανώς θέλεις να στείλεις κάτι στον client αλλά μάλλον κάτι δεν κάνεις καλά.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα