Nottarget
06-06-2007, 15:52
Premetto che ho pochissime basi della programmazione in C, ho fatto qualcosa in C++ e ultimamente mi sono dedicato esclusivamente a Java. Tornare ad un linguaggio procedurale dopo aver fatto di tutto con gli oggetti non è proprio bello... cmq dovrei sviluppare una Chat in C in locale, quindi senza alcun uso di protocolli di rete,socket e tutto il resto.
Quello che ho pensato è che dovrei creare un processo server che allochi una memoria condivisa con un certo numero di processi client che scriveranno concorrentemente in questa memoria(sincronizzati da un opportuno semaforo), sarà poi il server a inviare il messaggio ricevuto a tutti gli altri client connessi...
Il ragionamento va bene?
Quello che ho scritto fino ad ora sembra funzionare ma non so se va bene per quello che dovrei fare...
SERVER
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
char messaggio[256];
int shmid;
int *shmPtr; // puntatore alla memoria
int main(int argc, char *argv[]) {
int ds_shm, ris;
key_t chiaveMemoria = 4321; // chiave della memoria
shmid= shmget(chiaveMemoria, 32, IPC_CREAT|0600); // creo la memoria condivisa
if ( shmid == -1 ) printf("Errore nella chiamata shmget\n");
if ( shmid > 0 ) printf("Memoria allocata correttamente\n");
shmPtr=shmat(shmid,0,0);
return 0;
}
CLIENT
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
# include <string.h>
#define SHMSIZE 1000
#define DISP_ 20
char messaggio[256];
void invia(int ds) {
char *p;
p = shmat(ds, 0 , SHM_W);
if ( p == (char*) -1 ) printf("Errore nella chiamata shmat");
puts("Inizia a scrivere: ('quit‘ per terminare):");
do {
scanf("%s", messaggio);
strncpy(p, messaggio, DISP_);
p += DISP_;
} while( (strcmp(messaggio,"quit") != 0));
exit(0);
}
int shmid;
char messaggio[256];
int *shmPtr; // puntatore alla memoria
int main(int argc, char* argv[]){
key_t chiaveMemoria = 4321; // chiave della memoria
shmid=shmget(chiaveMemoria, 0, 0); // ci attacchiamo alla memoria condivisa
if(shmid > 0) printf ("Memoria collegata correttamente\n");
if(shmid == -1) printf ("Memoria non collegata correttamente\n");
invia(shmid);
exit(0);
}
Suggerimenti se quello che ho scritto va bene e su come continuare?
Grazie a tutti in anticipo
Quello che ho pensato è che dovrei creare un processo server che allochi una memoria condivisa con un certo numero di processi client che scriveranno concorrentemente in questa memoria(sincronizzati da un opportuno semaforo), sarà poi il server a inviare il messaggio ricevuto a tutti gli altri client connessi...
Il ragionamento va bene?
Quello che ho scritto fino ad ora sembra funzionare ma non so se va bene per quello che dovrei fare...
SERVER
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
char messaggio[256];
int shmid;
int *shmPtr; // puntatore alla memoria
int main(int argc, char *argv[]) {
int ds_shm, ris;
key_t chiaveMemoria = 4321; // chiave della memoria
shmid= shmget(chiaveMemoria, 32, IPC_CREAT|0600); // creo la memoria condivisa
if ( shmid == -1 ) printf("Errore nella chiamata shmget\n");
if ( shmid > 0 ) printf("Memoria allocata correttamente\n");
shmPtr=shmat(shmid,0,0);
return 0;
}
CLIENT
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
# include <string.h>
#define SHMSIZE 1000
#define DISP_ 20
char messaggio[256];
void invia(int ds) {
char *p;
p = shmat(ds, 0 , SHM_W);
if ( p == (char*) -1 ) printf("Errore nella chiamata shmat");
puts("Inizia a scrivere: ('quit‘ per terminare):");
do {
scanf("%s", messaggio);
strncpy(p, messaggio, DISP_);
p += DISP_;
} while( (strcmp(messaggio,"quit") != 0));
exit(0);
}
int shmid;
char messaggio[256];
int *shmPtr; // puntatore alla memoria
int main(int argc, char* argv[]){
key_t chiaveMemoria = 4321; // chiave della memoria
shmid=shmget(chiaveMemoria, 0, 0); // ci attacchiamo alla memoria condivisa
if(shmid > 0) printf ("Memoria collegata correttamente\n");
if(shmid == -1) printf ("Memoria non collegata correttamente\n");
invia(shmid);
exit(0);
}
Suggerimenti se quello che ho scritto va bene e su come continuare?
Grazie a tutti in anticipo