chris2060 Δημοσ. 6 Δεκεμβρίου 2008 Δημοσ. 6 Δεκεμβρίου 2008 γεια σας παιδια ... να μπω κατευθειαν στο θεμα... λοιπον εχω 2 κωδικες : ενα chatserver και ενα chatclient Ομως καθε χρηστης περιμενει υποχρεωτικα τον αλλον να πληκτρολογισει μια γραμμη. θελω να τον τροποποιεισω ωστε καθε χρηστης να γραψει οσες γραμμες θελει(χωρις δηλ. να περιμενει υποχρεωτικα τον αλλον να πληκτρολογησει κατι.) .... παραθετω τους κωδικες οι οποιοι ειναι σε C. καθε βοηθεια δεκτη...οποιος μπορεσει εστω και να μου πει την ιδεα ή και τι να τροποποιεισω στους 2 παρακατω κωδικες, θα βοηθουσε πολυ. ευχαριστω ... >/* chatclient.c */ #include <stdlib.h> #include <stdio.h> #include <cnaiapi.h> #define BUFFSIZE 256 #define INPUT_PROMPT "Input > " #define RECEIVED_PROMPT "Received> " int recvln(connection, char *, int); int readln(char *, int); /*----------------------------------------------------------------------- * * Program: chatclient * Purpose: contact a chatserver and allow users to chat * Usage: chatclient <compname> <appnum> * *----------------------------------------------------------------------- */ int main(int argc, char *argv[]) { computer comp; connection conn; char buff[bUFFSIZE]; int len; if (argc != 3) { (void) fprintf(stderr, "usage: %s <compname> <appnum>\n", argv[0]); exit(1); } /* convert the compname to binary form comp */ comp = cname_to_comp(argv[1]); if (comp == -1) exit(1); /* make a connection to the chatserver */ conn = make_contact(comp, (appnum) atoi(argv[2])); if (conn < 0) exit(1); (void) printf("Chat Connection Established.\n"); (void) printf(INPUT_PROMPT); (void) fflush(stdout); /* iterate, reading from local user and then from chatserver */ while((len = readln(buff, BUFFSIZE)) > 0) { buff[len - 1] = '\n'; (void) send(conn, buff, len, 0); /* receive and print a line from the chatserver */ if ((len = recvln(conn, buff, BUFFSIZE)) < 1) break; (void) printf(RECEIVED_PROMPT); (void) fflush(stdout); (void) write(STDOUT_FILENO, buff, len); (void) printf(INPUT_PROMPT); (void) fflush(stdout); } /* iteration ends when stdin or the connection indicates EOF */ (void) printf("\nChat Connection Closed.\n"); (void) send_eof(conn); exit(0); } >/* chatserver.c */ #include <stdlib.h> #include <stdio.h> #include <cnaiapi.h> #define BUFFSIZE 256 #define INPUT_PROMPT "Input > " #define RECEIVED_PROMPT "Received> " int recvln(connection, char *, int); int readln(char *, int); /*----------------------------------------------------------------------- * * Program: chatserver * Purpose: wait for a connection from a chatclient & allow users to chat * Usage: chatserver <appnum> * *----------------------------------------------------------------------- */ int main(int argc, char *argv[]) { connection conn; int len; char buff[bUFFSIZE]; if (argc != 2) { (void) fprintf(stderr, "usage: %s <appnum>\n", argv[0]); exit(1); } (void) printf("Chat Server Waiting For Connection.\n"); /* wait for a connection from a chatclient */ conn = await_contact((appnum) atoi(argv[1])); if (conn < 0) exit(1); (void) printf("Chat Connection Established.\n"); /* iterate, reading from the client and the local user */ while((len = recvln(conn, buff, BUFFSIZE)) > 0) { (void) printf(RECEIVED_PROMPT); (void) fflush(stdout); (void) write(STDOUT_FILENO, buff, len); /* send a line to the chatclient */ (void) printf(INPUT_PROMPT); (void) fflush(stdout); if ((len = readln(buff, BUFFSIZE)) < 1) break; buff[len - 1] = '\n'; (void) send(conn, buff, len, 0); } /* iteration ends when EOF found on stdin or chat connection */ (void) send_eof(conn); (void) printf("\nChat Connection Closed.\n\n"); return 0; }
Directx Δημοσ. 6 Δεκεμβρίου 2008 Δημοσ. 6 Δεκεμβρίου 2008 Αν και δεν γνωρίζω τις ρουτίνες που χρησιμοποιείς (readln κτλ.) φαίνεται ότι η readln είναι blocking (μπλοκάρει την εκτέλεση του υπόλοιπου κώδικα μέχρι να ολοκληρωθεί) οπότε η γράφεις μια διαφορετική readln που θα ελέγχει για απαντήσεις όση ώρα ελέγχει το πληκτρολόγιο ή μπορείς να δοκιμάσεις την χρήση threads, μια για ανάγνωση πληκτρολογίου (ή) μια για ανάγνωση νέων μηνυμάτων ώστε τέλος πάντων το main thread του προγράμματος να μένει ελεύθερo.
BadGuy Δημοσ. 6 Δεκεμβρίου 2008 Δημοσ. 6 Δεκεμβρίου 2008 Συμφωνώ με αυτά που είπε ο φίλος από πάνω. Κάποια από τις readln ή recvln είναι blocking.Μπορείς να κάνεις αυτό που θες με thread που πρότεινε ο φίλος από πάνω ή μπορείς να το κάνεις και με τη χρήση της fork(ότι σε βολεύει καλύτερα) όπου η διεργασία πατέρας θα περιμένει για μήνυμα από τον άλλο χρήστη και και η διεργασία παιδί θα αναλαμβάνει να στέλνει τα μηνύματα του χρήστη.
domuom Δημοσ. 7 Δεκεμβρίου 2008 Δημοσ. 7 Δεκεμβρίου 2008 μπορειτε να πειτε περιπου πως θα γινει χωρις threads? γιατι εχω κι εγω το ιδιο προβλημα αλλα πρεπει να το υλοποιησω χωρις threads.
chris2060 Δημοσ. 7 Δεκεμβρίου 2008 Μέλος Δημοσ. 7 Δεκεμβρίου 2008 με threads ειναι ευκολο κυριως σε java. οστωσο χωρις την χρηση threads και χωρις να πειραξουμε τις readln και recvln , καμια ιδεα για το πως θα μπορουσε να γινει? μονο με τροποποιηση των 2 παραπανω κωδικων..... any ideas? thanks...
ippo00 Δημοσ. 8 Δεκεμβρίου 2008 Δημοσ. 8 Δεκεμβρίου 2008 Και σε C θα είναι εύκολο να γίνει είτε με threads είτε με ένα ωραιότατο fork. Χωρίς αυτά.. λίγο δύσκολο.. πρέπει να καταλάβεις γιατί στο λένε :/ υ.γ: Άμα είναι να το κάνεις χωρίς να το forks || threads θάναι ποιό δύσκολο.. υ.γ.2: Αν μου βρείς τα sources για την cnaiapi για linux θα το κάνω σε 5 λεπτά..
chris2060 Δημοσ. 8 Δεκεμβρίου 2008 Μέλος Δημοσ. 8 Δεκεμβρίου 2008 σου εστειλα προσωπικο μνμ στο Insomnia ... thanks
thesdes Δημοσ. 8 Δεκεμβρίου 2008 Δημοσ. 8 Δεκεμβρίου 2008 αμα βρειτε τη λυση παιδια και σας ειναι ευκολο ανεβαστε τη γιατι το ψαχνω και γω αυτο.ευχαριστω πολυ.
ippo00 Δημοσ. 9 Δεκεμβρίου 2008 Δημοσ. 9 Δεκεμβρίου 2008 Βασικά αυτό, αντίθετα με αυτό που νόμιζα αρχικά. όπως είναι δεν μπορείς να το κάνεις ούτε thread ούτε fork. Χωρίς σημαντικές αλλάξεις στο Code.
chris2060 Δημοσ. 9 Δεκεμβρίου 2008 Μέλος Δημοσ. 9 Δεκεμβρίου 2008 καποιος αλλος καμια ιδεα χωρις την χρηση threads?
thesdes Δημοσ. 9 Δεκεμβρίου 2008 Δημοσ. 9 Δεκεμβρίου 2008 απο οτι εχω μαθει η ασκηση αυτη υπαρχει και σε βιβλιο και υπαρχει ως υποδειξη να λυθει με threads
chris2060 Δημοσ. 9 Δεκεμβρίου 2008 Μέλος Δημοσ. 9 Δεκεμβρίου 2008 μονο που ποτε δεν διδαχτηκαμε threads.
pinball_elf Δημοσ. 9 Δεκεμβρίου 2008 Δημοσ. 9 Δεκεμβρίου 2008 Νομίζω ότι η συνάρτηση select έιναι αυτό που χρεάζεστε.
chris2060 Δημοσ. 9 Δεκεμβρίου 2008 Μέλος Δημοσ. 9 Δεκεμβρίου 2008 πως τρεχει σε windws η select? θελει #include <sys/select.h> μονο απο Linux τρεχει δηλαδη?
pinball_elf Δημοσ. 9 Δεκεμβρίου 2008 Δημοσ. 9 Δεκεμβρίου 2008 Σε windows λειτουργικό η select θέλει: > #include <winsock2.h>
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.