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

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

Δημοσ.

Γειά σας,

 

Φτιάχνω έναν 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, τα κάνω αλλά και πάλι...

 

Μήπως μπορεί να βοηθήσει κάποιος?

 

Ευχαριστώ

Δημοσ.

Όσες παραπάνω πληροφορίες παρέχεις, τόσο καλύτερη βοήθεια θα μπορούμε να δώσουμε. Γράψε τουλάχιστον τι μήνυμα σου βγάζει :P

 

Για την ώρα αυτό που μου έρχεται στο μυαλό είναι να χρησιμοποιήσεις ntohl αντί για ntohs.

Δημοσ.

Όσες παραπάνω πληροφορίες παρέχεις, τόσο καλύτερη βοήθεια θα μπορούμε να δώσουμε. Γράψε τουλάχιστον τι μήνυμα σου βγάζει :P

 

Για την ώρα αυτό που μου έρχεται στο μυαλό είναι να χρησιμοποιήσεις 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’

Δημοσ.

 

 

Μου βγάζει αυτό

>
προειδοποίηση: 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) για αυτό βαράει και σου λέει ότι χρειάζεσαι δείκτη.

Δημοσ.

Σωστά :)

 

Βλακεία έγραψα πριν. Αφού είχες τη γραμμή με το write ήταν αρκετό.

 

>
ssize_t write(int fd, const void *buf, size_t count);

 

Εδώ έχουμε τη σύνταξη. Η write όπως όλες οι συναρτήσεις τέτοιου είδους περιμένει ένα δείκτη στα δεδομένα. Αντί για αυτό εσύ πέταξες κατευθείαν τα δεδομένα που θέλεις να γράψεις δηλαδή ένα integer (uint32_t) για αυτό βαράει και σου λέει ότι χρειάζεσαι δείκτη.

 

και σε δεικτη ομως που το εκχωρώ αρχικά πάλι τα ίδια μου κάνει....

Δημοσ.

Δείξε αυτό το τμήμα του κώδικα με τη μορφή που έχεις δείκτη καθώς και το error που πετάει ο compiler σε αυτή τη μορφή.

 

>
char * port = htons(serv->s_port);
n = write(newsockfd,port,sizeof(port));

Δημοσ.

Εδώ κάνεις το ίδιο λάθος με άλλα λόγια.

 

Χρησιμοποιείς μεν δείκτη στη write αλλά έχεις λάθος την πάνω γραμμή. Ορίζεις ένα δείκτη (και μάλιστα σε char) και του δίνεις τιμή ένα ακέραιο.

 

>
int tmp = htons(serv->s_port);
write(blah, &tmp, blah);

 

Δοκίμασες κάτι τέτοιο ?

Δημοσ.

Εδώ κάνεις το ίδιο λάθος με άλλα λόγια.

 

Χρησιμοποιείς μεν δείκτη στη write αλλά έχεις λάθος την πάνω γραμμή. Ορίζεις ένα δείκτη (και μάλιστα σε char) και του δίνεις τιμή ένα ακέραιο.

 

>
int tmp = htons(serv->s_port);
write(blah, &tmp, blah);

 

Δοκίμασες κάτι τέτοιο ?

 

To εκανα τώρα αλλά δεν βγάζει κάτι...θα είναι ή κενό ή σκουπίδια...

Δημοσ.

>
% 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 μορφή δηλαδή αυτό που του είπαμε να γράψει.

Δημοσ.

Ο κωδικας μου ειναι αυτός

>
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));

 

παλι σκουπιδια βγαζει....

Δημοσ.

Αν δεν θέλεις να δώσεις κώδικα για κάποιο λόγο (πχ πρόκειται για λύση άσκησης), τότε περίμενε μήπως κάποιο άλλο παιδί σου προτείνει κάτι που μου διέφυγε.

Δημοσ.

>
char * port = htons(serv->s_port);
n = write(newsockfd,port,sizeof(port));

 

Αρχικά εδώ το sizeof(port) είναι το sizeof(char*) δηλαδή ανάλογα με το σύστημα είσαι στα 4 bytes. Πρόσεξε το αυτό, μήπως θέλεις καλύτερα κάποια strlen. Επίσης η htons επιστρέφει short int, και όχι char* αλλά αλήθεια γιατί τα κάνεις όλα αυτά; Προφανώς θέλεις να στείλεις κάτι στον client αλλά μάλλον κάτι δεν κάνεις καλά.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...