Apanepai Δημοσ. 30 Οκτωβρίου 2008 Δημοσ. 30 Οκτωβρίου 2008 Υπάρχει ο εξής κώδικας: >int main(int argc, char *argv[]) { int sd, ns, len; struct sockaddr sockaddr; socklen_t fromlen; char buf[256]; if ((sd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { cout<<"Server socket failure."<<endl; exit(1); } sockaddr.sa_family = AF_UNIX; strcpy(sockaddr.sa_data, "MySocket"); len = strlen(sockaddr.sa_data) + sizeof(sockaddr.sa_family); unlink("MySocket"); if (bind(sd, &sockaddr, len) == -1) { cout<<"Server bind failure."<<endl; exit(1); } if (listen(sd, 5) == -1) { cout<<"Server listen failure."<<endl; exit(1); } fromlen=len; for(; { cout<<"Waiting for a connection..."<<endl; if ((ns = accept(sd, &sockaddr, &fromlen)) == -1) { cout<<"Server accept failure."<<endl; exit(1); } cout<<"Connected"<<endl; close(ns); } return 0; } Πρόβλημα υπάρχει όταν καλείται η accept αλλά δεν μπορώ να καταλάβω γιατί υπάρχει πρόβλημα. Υπάρχει κανείς που μπορεί να βοηθήσει γιατί όσα και να διάβασα στο net δεν μπόρεσα να λύσω το πρόβλημα.
fromaz Δημοσ. 30 Οκτωβρίου 2008 Δημοσ. 30 Οκτωβρίου 2008 Διάβασες στο NET ότι μπορείς να γράφεις ότι θέλεις στο sa_data? Μου κάνει εντύπωση... Επιπλέον, όταν μια συνάρτηση socket επιστρέφει -1, εξετάζουμε το errno (/sock_errno) για να μάθουμε τον λόγο, αν και στη δική σου περίπτωση βγάζει μάτι!
Apanepai Δημοσ. 30 Οκτωβρίου 2008 Μέλος Δημοσ. 30 Οκτωβρίου 2008 Έχω γνώση για την errno απλά σε πρώτη φάση δοκιμάζω να δω εαν δουλεύει η επικοινωνία. Όσον αφορά το άλλο που αναφέρεις σχετικά με το sa_data σύμφωνα με όσα διάβασα εδώ δεν βλέπω κάποιο πρόβλημα: http://netcins.ceid.upatras.gr/OpSys-I/project/Socket.htm Μήπως θα μπορούσες να γίνεις ποιό συγκεκριμένος? Ευχαριστώ.
pinball_elf Δημοσ. 31 Οκτωβρίου 2008 Δημοσ. 31 Οκτωβρίου 2008 Πρώτο από όλα δεν έχεις θέσει την πόρτα (sockaddr.sin_port) του server. Δέυτερον σου λείπει ο περιορισμός για το ποιά δικτυα, subnets, (sockadd.sin_addr.s_addr) προορίζεται ο server. Τριτον η εντολή unlink χρησιμοποιείται για την διαγραφή ενός "soft link" ενός αρχείου, και οπότε είναι λίγο άσχετη. Και τελευταίο η τιμή του sockaddr.sa_data την θέτεις με την εντολή bind, πράγμα που κάνεις παρακάτω και όχι με την strcpy. π.χ. > struct sockaddr_in sin; sin.sin_family=AF_INET; sin.sin_port=9999; sin.sin_addr.s_addr=htonl(INADDR_ANY); if ((s=socket(AF_INET,SOCK_STREAM,0)) < 0) ... if (bind(s, &sin, sizeof(sin)) < 0) ... OK σορρυ για τι μπερδεμα. (31/10/2008)
warchief Δημοσ. 31 Οκτωβρίου 2008 Δημοσ. 31 Οκτωβρίου 2008 @pinball_elf: Πρόσεξε δεν μιλάμε για TCP/IP sockets, αλλα για UNIX sockets (interprocess communication). Γι αυτό και το address family (AF) που χρησιμοποιεί για να δημιουργήσει το socket δεν είναι AF_INET (IPv4/6) αλλα AF_UNIX. Δυστυχώς δεν έχω χρόνο για να το δώ παραπάνω.
Apanepai Δημοσ. 31 Οκτωβρίου 2008 Μέλος Δημοσ. 31 Οκτωβρίου 2008 Ευχαριστώ όλους όσους ασχολήθηκαν. Τελικά ο κώδικας δεν είχε κάποιο πρόβλημα πέραν από την προχειρότητα με την οποία είναι γραμμένος. Η accept είναι blocking system call συνεπώς γίνονταν block εφόσον δεν υπήρχε κάποια αίτηση για τον server για αυτό υπήρχε αυτό το "πάγωμα". Έγω πήγαινα να κάνω το test μέσα από τον κώδικα του server. Έφτιαξα λοιπόν έναν πρόχειρο client και δεν υπάρχει κάποιο πρόβλημα. Όλα είναι οκ. @fromaz Ναι στο sa_data[14] ορίζεις ένα όνομα για το soscket συνεπώς ναι μπορείς να γράψεις ότι θέλεις αρκεί να είναι μέσα στα όρια του πίνακα.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.