χαχαχαχα ξεπουλάει το μαγαζί...

Εδώ σ'εχασα λίγο...
Οποίον τρόπο και να διαλέξεις (εκτός αν δεν χρησιμοποίησεις καθόλου παράλληλο προγραμματισμό) θα χρειαστείς τουλάχιστον δυο threads: το server thread και το client thread.
- Το server thread θα κάνει bind() και θα ανοίξει ένα socket που θα κάνει listen(). Κάθε φορά που θα συνδέεται ένα νέο node μέσω του socket που κάνει listen(), θα δημιουργείται ένα νέο socket, θα το πω για ευκολία
node socket.
- Το client thread θα λουπάρει τη λίστα με τις IP των nodes και θα προσπαθεί να κάνει connect() σε κάθε node που δεν είναι συνδεδεμένο με το δικό σου node (βλ. status στο προηγούμενο ποστ). Κάθε φορά που θα γίνεται επιτυχές connect() θα δημιουργείται ένα καινούργιο socket, επίσης
node socket.
Απο εκεί και πέρα αυτό που έγραφα στο προηγούμενο ποστ είναι ότι ενδεικτικά μπορείς να κάνεις τις εξής υλοποιήσεις:
Α) να φτιάχνεις ένα καινούργιο thread για κάθε
node socket, να κάνεις την ανταλλαγή μηνυμάτων και να το κλείνεις μετά
Β) να στέλνεις όλα τα
node sockets σε ένα thread και να χρησιμοποιήσεις I/O multiplexing για να κάνεις την ανταλλαγή μηνυμάτων σε όλα μαζί απο το ίδιο thread.
Λέγωντας Ι/Ο multiplexing εννοώ select, poll ή epoll ή kqueue. Προτείνω select ή poll μιας και δεν παίζει με τίποτα να έχουμε πάνω απο 10 nodes ταυτόχρονα συνδεδεμένα οπότε δεν έχει νοήμα να μπλέξεις με τα τελευταία που είναι πιο περίπλοκα.
Αν πάλι δεν έγινα κατανοητός, γράψε μέχρι να το βρούμε

Χαχα..Οκ..έτσι όπως το θέτεις δεν γίνεται να μην ρωτήσω κι άλλη ερώτηση....
Κοίτα..έχω τις εξής απορίες για να το κλείσουμε το θέμα..

ελπίζω δηλαδή

:
1.Τα server thread και τα client thread είναι απαραίτητα ή μπορώ να κάνω threads μόνο συγκεκριμένα set εντολών των server και των client
πχ listen,connect κλπ και όχι ολόκληρο τον client και τον server?

Γιατί σε προηγούμενα posts αυτό μου είχες πει εκτός αν κατάλαβα εγώ λάθος..

2.Τα server thread και client thread σαν τελευταίο όρισμα(το τέταρτο από αριστερά προς τα δεξιά)πρέπει να έχουν το buffer μου ή όποια θέση μνήμης θέλω?και πρέπει να είναι κοινή μεταξύ τους ή όχι?
3.Όταν λες το client thread θα λουπάρει τη λίστα με τις IP των nodes τι εννοείς?Ότι θα είναι μέσα σε while(1) όλες οι εντολές?
Και ακόμα και αυτό να εννοείς πώς θα λουπάρει τη λίστα με τις IPs?Εννοείς ότι κάθε φορά που θα μπαίνει στη λούπα θα προσπαθεί να κάνει connect στην εκάστοτε Receivers IP ή Servers IP να το πω καλύτερα που όρισα?Ή με άλλα λόγια την IP που κάθε φορά εγώ θα ορίζω σαν Receivers IP με τυχαίο τρόπο -εννοώ με τον τρόπο που μας είπανε είτε μέσα στη while(1) είτε έξω από την while(1) μέσω όποιου τρόπου το ορίσαμε εμείς όπως πχ μέσω alarm(1) κλπ- αυτό θα προσπαθεί να την κάνει connect και αν γίνει το connect αυτό θα δημιουργήσει ένα νέο socket?Αυτό εννοείς που λέω ή εννοείς κάτι άλλο θα λουπάρει τις IPs?Επίσης το AEM τo δικό μας πρέπει σε λούπα να το πληκτρολογούμε εμείς ή αλλιώς πρέπει να το εισάγουμε?Για το ΑΕΜ του παραλήπτη μας είπανε..μέσω τυχαίου τρόπου θα επιλέγεται....
4.Είναι απαραίτητο να φτιάχνω ένα καινούργιο thread για κάθε node socket που δημιουργείται ή όχι?
Επίσης είναι απαραίτητο να το κλείνω μετά ή όχι?Φαντάζομαι να κάνω exit εννοείς σωστά?Αλλά είναι απαραίτητο αυτό ή όχι?
Και τέλος για κάθε καινούργιο node socket που δημιουργείται εννοείς από την εντολή sockfd = socket(AF_INET, SOCK_STREAM, 0) και κάτω??
5.Πώς ορίζω την SENDERS IP και την RECEIVERS IP ώς client_address και server_adress αντίστοιχα για να μπορέσω να τις χρησιμοποιήσω μετά στα socket?Θα μπορούσα να κάνω πχ αυτό serv_addr.sin_addr.s_addr=SENDER_ADDR;
cli_addr.sin_addr.s_addr=RCVER_ADDR;??Επίσης στα sockets πώς ορίζω την IP? Όπως είπα ή αλλιώς?
πχ στο socket του client bcopy((char *)server->h_addr, ενώ στο socket του server serv_addr.sin_addr.s_addr =
(char *)&serv_addr.sin_addr.s_addr, INADDR_ANY;
server->h_length);
6.Ως 4α ορίσματα theads ξεχωριστών και μεμονωμένων set εντολών και όχι όλου του client ή του server όπως πχ αν κάνω threads ξεχωριστά για listening ή για connect τι πρέπει να βάλω?newsockfd ενώ στο listening sockfd?Επίσης σαν 4α ορίσματα των socket threads αν κάνω?την server adress??
7.Για να γίνει αυτή η επαναληψιμότητα τόσο στο διάβασμα των μηνυμάτων όσο και στο ένας server να μπορεί να εξυπηρετήσει πολλούς clients και ένας client να μπορεί να εξυπηρετήσει πολλούς servers(ποιο από τα δύο είναι απαραίτητο??) πρέπει να
βάλω είτε την connect είτε την listen μέσα σε επανάληψη ίση με τον αριθμό των nodes που θα έχουμε??
Πρέπει να κάνω κάτι αντίστοιχο είτε κάνω socket threads είτε όχι και για τα node sockets που τυχόν θα δημιουργηθούν αν γίνει ένα connection ή όχι??
8.Αυτό που λέει στην εκφώνηση της εργασίας <<Αποστέλλονται όλα τα μηνύματα που δεν έχουν σταλεί στον συγκεκριμένο παραλήπτη στο παρελθόν>> πώς το κάνουμε?Ελέγχουμε το socket που μας στέλνει ο client??και πριν στείλουμε κάτι ελέγχουμε τι έχει μέσα στον buffer μας??Επίσης αντίγραφα από τον buffer πρέπει να κρατάει και ο server και ο client????Επομώνως εν τέλει πρέπει να βάλω 2 buffer διαφορετικούς?1 για τον server κι έναν για τον client?Ή θα χειρίζονται και οι 2 τον ίδιο buffer πχ με κάποιο mutex??
Από το socket πρέπει να στέλνουμε 1-1 μήνυμα τη φορά επίσης ή όλα μαζί?Εγώ δεν ξέρω να το κάνω όλα μαζί..μόνο μήνυμα μήνυμα..
Τέλος σε περίπτωση που είναι 1 τελικά ο buffer στον buffer αποθηκεύονται μόνο αυτά που λαμβάνονται(όπως και αναφέρει?)ή και αυτα που δημιουργούνται και αποστέλλονται??Αυτό δεν το ξεκαθαρίζει!!
Τον τρόπο με το I/O Multiplexing άστον καλύτερα γιατί πρώτον πρέπει ακόμα να μάθω τα βασικά

Δεύτερον όπως είπες κι εσύ για 10 ΑΕΜ να κάτσω να ασχοληθώ με την select() δεν έχει τόσο νόημα..Απλά σε ρώτησα για να πάρω μια ιδέα..
Τελείωσα με τις ερωτήσεις

Όπως και να χει χίλια ευχαριστώ για τις απαντήσεις σου..Αν μου απαντήσεις και σε αυτές πιστεύω με κάλυψες....
