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

help σε c -τροποποιηση κωδικα


chris2060

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

Δημοσ.

γεια σας παιδια ...

να μπω κατευθειαν στο θεμα...

λοιπον εχω 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;
}

Δημοσ.

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

Δημοσ.

Συμφωνώ με αυτά που είπε ο φίλος από πάνω. Κάποια από τις readln ή recvln είναι blocking.Μπορείς να κάνεις αυτό που θες με thread που πρότεινε ο φίλος από πάνω ή μπορείς να το κάνεις και με τη χρήση της fork(ότι σε βολεύει καλύτερα) όπου η διεργασία πατέρας θα περιμένει για μήνυμα από τον άλλο χρήστη και και η διεργασία παιδί θα αναλαμβάνει να στέλνει τα μηνύματα του χρήστη.

Δημοσ.

μπορειτε να πειτε περιπου πως θα γινει χωρις threads?

γιατι εχω κι εγω το ιδιο προβλημα αλλα πρεπει να το υλοποιησω χωρις threads.

Δημοσ.

με threads ειναι ευκολο κυριως σε java.

οστωσο χωρις την χρηση threads και χωρις να πειραξουμε τις readln και recvln , καμια ιδεα για το πως θα μπορουσε να γινει?

μονο με τροποποιηση των 2 παραπανω κωδικων.....

 

any ideas? thanks...

Δημοσ.

Και σε C θα είναι εύκολο να γίνει είτε με threads είτε με ένα ωραιότατο fork.

Χωρίς αυτά.. λίγο δύσκολο.. πρέπει να καταλάβεις γιατί στο λένε :/

 

υ.γ: Άμα είναι να το κάνεις χωρίς να το forks || threads θάναι ποιό δύσκολο..

υ.γ.2: Αν μου βρείς τα sources για την cnaiapi για linux θα το κάνω σε 5 λεπτά..

Δημοσ.

Βασικά αυτό, αντίθετα με αυτό που νόμιζα αρχικά. όπως είναι δεν μπορείς να το κάνεις ούτε thread ούτε fork. Χωρίς σημαντικές αλλάξεις στο Code.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...