Sto sviluppando un semplice sistema di chat basato su architettura client/server che sfrutta socket come sistema di comunicazione.
Anche se la comunicazione tra due processi client (attraverso il server) viene effettuata con successo, non mi piace il fatto che sia l'input che l'output della chat siano visualizzati sulla stesso terminale!
Ad esempio: Chat tra client1 e client2. Se mentre il client1 sta scrivendo, il client2 invia un messaggio, la risposta verrà stampata in coda al messaggio che client1 sta scrivendo.
Codice: Seleziona tutto
VISUALIZZAZIONE CLIENT2:
Client2: Ciao client1
Client2:...
VISUALIZZAZIONE CLIENT1:
Client1: Ciao cli... //sta scrivendo
//arriva il messaggio di CLIENT2
Client1: Ciao cliClient2: Ciao client1
Client1:...
--> Apro una nuova console sfruttando la system call system() e redirigo su un file apposito l'output del comando "$ tty" eseguito su questa console ( passo come parametro "gnome-terminal -x sh -c \"tty > nome_file; bash\"" ), in questo modo ottengo il nome del file di tipo device a caratteri associato alla console.
--> Ottengo il descrittore di questo file passando il nome come parametro alla system call open() .
--> Scrivo con write() usando il descrittore ottenuto.
Questo è il codice C che ho scritto:
Codice: Seleziona tutto
#include <stdio.h> //per funzioni di I/O (printf, ecc...)
#include <stdlib.h> //per funzioni quali malloc, free, ecc.
#include <unistd.h> //per execlp, unlink
#include <fcntl.h> //per flag file
#define NOME_FILE "term" //nome file
#define SIZE_NOME_FILE 4
#define PERM 0666 //permessi read/write per il file
#define SIZE_PROVA 15
void main(int argc, char *argv[]) {
char buff[SIZE_PROVA];
char nome_file[SIZE_NOME_FILE] = NOME_FILE;
int fd_file_nome_terminale = open(NOME_FILE, O_CREAT | O_RDWR, PERM);
if(fd_file_nome_terminale < 0)
printf("ERRORE nella creazione del file %s!\n", nome_file);
if(lseek(fd_file_nome_terminale, 0, 0) == -1) {
printf("ERRORE nella ricollocazione del filepointer!\n");
}
if(system("gnome-terminal -x sh -c \"tty > term; bash\"") == -1) {
printf("ERRORE nella system!\n");
}
if(lseek(fd_file_nome_terminale, 0, 0) == -1) {
printf("ERRORE nella ricollocazione del filepointer!\n");
}
if(read(fd_file_nome_terminale, buff, SIZE_PROVA) == -1) {
printf("ERRORE nella lettura di prova!\n");
}
if(lseek(fd_file_nome_terminale, 0, 0) == -1) {
printf("ERRORE nella ricollocazione del filepointer!\n");
}
// inserisco terminatore di stringa
int terminatore = strlen(buff);
printf("strlen: %d\n", terminatore);
buff[terminatore - 1] = '\0';
printf("buff: %s\n", buff);
int fd_terminale = open(buff, O_CREAT);
if(fd_terminale < 0)
printf("ERRORE nel tentativo di ottenere il descrittore del terminale!\n");
printf("descr_term: %d\n", fd_terminale);
if(write(fd_terminale, "prova\n", 6) == -1 ){
printf("Errore nella scrittura di prova nel nuovo terminale!\n");
}In sostanza, non riesco a fare in modo che quello che scrivo venga stampato sulla nuova console.
Secondo voi, la procedura è corretta? Oppure ne esiste una alternativa? Grazie a tutti!
