Δημοσιεύτηκε: 15 Απρ 2010, 11:16
από idomeneas
Καταρχήν γεια σου και απο μένα.
Το segmentation fault που παράγεται από τον κώδικα που παράθεσες φαίνεται να οφείλεται στη συνάρτηση error. Βάζοντας ένα printf πριν και μετά ή κανοντας αποσφαλμάτωση με gdb, θα βρεις ότι αυτό το core φαίνεται να βγαίνει κατά την κλήση της συνάρτησης
error("Disconnected").
Προσπάθησε να την ορίσεις πριν τη main(). Δηλαδή :
Κώδικας: Επιλογή όλων
void error(char* message);
void error(char* message){
perror(message);
exit(0);
}

Αυτό γιατί η perror() πρέπει να είναι μέσα σε αυτές που βρίσκονται στα αρχεία κεφαλίδες που έχεις ορίσει. Αν θες, ψάξε γιατί η μεταγλώτιση αναφέρει μηνύματα προειδοποίησης (warnings). Καλό είναι να μην υπάρχουν τέτοια μηνύματα. Επίσης δεν υπάρχει αρχείο strings.h αλλά string.h. Υπάρχουν κλήσεις σε συναρτήσεις εσωτερικά που απαιτούν το stdlib.h. Ακόμα για τη χρήση της perror() προσθέτουμε το αρχείο errno.h
Τέλος αν προσθέσεις άμεσα το αρχείο κεφαλίδα unistd.h, αντί του /sys/types.h (στο οποίο περιέχεται όμως), και το αρχείο arpa/inet.h δε θα έχεις τόσα προειδοποιητικά μηνύματα.Ένα τελευταίο warning αφορά τη μετατροπή της δομής servaddr από τύπο sockaddr_in σε τύπο const *sockaddr η οποία θα γίνει αν γράψεις
Κώδικας: Επιλογή όλων
connect(sockfd_cl,(struct sockaddr*)&servaddr,sizeof(servaddr));
αντί αυτού που έγραψες. Η μεταγλώτιση που δοκιμάστηκε έγινε στο τερματικό με
Κώδικας: Επιλογή όλων
gcc -o test.o -Wall test.c
και δεν έβγαλε κανένα μήνυμα. Τώρα για το τι κάνει το πρόγραμμα όταν το τρέχεις, αυτό εσύ θα πρέπει να το ξέρεις. Δε μπορώ να βοηθήσω πάνω σε αυτό.