problema System Call code di messaggi[risolto]

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
JordanDunk
Prode Principiante
Messaggi: 55
Iscrizione: lunedì 24 aprile 2017, 15:48
Desktop: Ubuntu
Distribuzione: Ubunto 16.10 | x86_64
Sesso: Maschile

problema System Call code di messaggi[risolto]

Messaggio da JordanDunk »

Buongiorno a tutti. Ho creato un server che crea la coda di messaggi. Poi ho creato due client i quali devono inviare(client1) e ricevere(client2) i messaggi. Il client2 che dovrebbe ricevere il messaggio mi da questo errore:msgrcv: Invalid argument. Voi sapreste aiutarmi?

qui vi riporto il codice:
Client2(riceve messaggi se mtype=1 riceve il server, altrimenti mtype=2 riceve client2)

Codice: Seleziona tutto

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include "def1.h"

#define MSGKEY   90		/* chiave per la coda */
#define MSGTYPE  2		/* tipo per il messaggio da ricevere */

int msgid;		/* identificatore della coda */

int main(int argc, char *argv[]) {

	/*
		puntatore alla struttura che rappresenta il messaggio.
		Il messaggio è definito nel file def.h
	*/
	message *m;

	/* allocazione memoria per il messaggio */
	m = (message *) malloc(sizeof(message));

	/*
		Il processo si mette in attesa per leggere dalla coda
	*/
	while(1) {

		

		/*
			la system call msgrcv riceve i messaggi dalla coda msgid e li
			memorizza nel buffer m.
			Il terzo parametro della funzione rappresenta la dimensione
			del messaggio ad esclusione dello spazio necessario a contenere
			il campo mtype della struttura.
			Il quarto parametro indica che devono essere letti solo i messaggi
			con message type MSGTYPE.
			L'ultimo parametro indica che il processo deve rimanere in attesa
			se non ci sono messaggi nella coda.
			Vedere man msgrcv.
		*/
		if(msgrcv(msgid, m, sizeof(message) - sizeof(m->mtype), MSGTYPE, 0) == -1) {
			perror("msgrcv");
			msgctl(msgid, IPC_RMID, NULL);
			exit(1);
		}

		/*
			ogni volta che viene letto un messaggio l'allarme deve
			essere disattivato per evitare che scatti impropriamente
		*/
		

		/* stampa a video del contenuto del messaggio */
		printf("mtype = %ld\n", m->mtype);
		printf("il messaggio è = %s\n", m->mex);
		
		printf("\n\n *** ***\n\n");
	}

}

client1(manda messaggi)

Codice: Seleziona tutto

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdlib.h>
#include "def1.h"

#define MSGKEY   90
//#define MSGTYPE  1



int main(int argc, char *argv[]) {

	//definire mtype
	int dmtype;
	printf("inviare al server o al client\n");
	scanf("%d", &dmtype);

	/*
		puntatore alla struttura che rappresenta il messaggio.
		Il messaggio è definito nel file def1.h
	*/
	message *m;

	int msgid;		/* identificatore della coda */

	char c = 'S';

	/* allocazione memoria per il messaggio */
	m = (message *) malloc(sizeof(message));

	/*
		apertura  della coda di messaggi corrispondente
		alla chiave MSGKEY
	*/
	if((msgid = msgget(MSGKEY, 0666)) == -1) {
		perror("Apertura della coda di messaggi fallita.\n");
		exit(1);
	}

	/*
		il processo cicla finchè l'utente vuole
		inviare nuovi messaggi al server
	*/
	while(c == 'S' || c == 's') {

		/* creazione del messaggio da inviare */
		m->mtype = dmtype;

		printf("Digitare messaggio: ");
		scanf("%s", (m->mex));


		/*
			la system call msgsnd spedisce il messaggio
			memorizzato nel buffer m verso la coda msgid.
			Il terzo parametro della funzione rappresenta la dimensione
			del messaggio ad esclusione dello spazio necessario a contenere
			il campo mtype della struttura.
			L'ultimo parametro indica che il processo deve rimanere in attesa
			se la coda è piena finche' si libera spazio per inserire il
			messaggio.
			Vedere man msgsnd.
		*/
		if(msgsnd(msgid, m, sizeof(message) - sizeof(m->mtype), 0) == -1) {
			perror("msgsnd");
			exit(1);
		};

		/*
			all'utente viene chiesto se vuole inviare
			un nuovo messaggio
		*/
		do {
			c = getchar();
			printf("Altro messaggio? [S/N] ");
			c = getchar();
		} while (c != 's' && c != 'n' && c != 'S' && c != 'N');

	}

	return 0;
}
Server

Codice: Seleziona tutto

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include "def1.h"

#define MSGKEY   90		/* chiave per la coda */
#define MSGTYPE  1		/* tipo per il messaggio da ricevere */

int msgid;		/* identificatore della coda */

/*
	funzione che cattura il segnale inviato dal timer
	il timer scatta se per 30 secondi non arrivano
	nuovi messaggi dal processo client
*/
void exit_fnc() {

	/* la coda viene rimossa. Vedere man msgctl */
	msgctl(msgid, IPC_RMID, NULL);
	printf("Tempo di attesa scaduto. Bye!\n");
	exit(1);
}


int main(int argc, char *argv[]) {

	/*
		puntatore alla struttura che rappresenta il messaggio.
		Il messaggio è definito nel file def.h
	*/
	message *m;

	/* allocazione memoria per il messaggio */
	m = (message *) malloc(sizeof(message));

	/*
		Creazione della coda di messaggi.
		La flag 0666|IPC_CREAT|IPC_EXCL fa sì che la
		coda venga creata, con permessi di lettura e
		scrittura per tutti, solo se non esiste già
		un'altra coda associata alla chiave MSGKEY.
		Vedere man msgget
	*/
	if((msgid = msgget(MSGKEY, (0666|IPC_CREAT|IPC_EXCL))) == -1) {
		perror("Creazione della coda di messaggi fallita");
		exit(1);
	}

	/*
		il processo si registra per catturare il segnale
		SIGALRM inviato dalla alarm
	*/
	signal(SIGALRM, exit_fnc);


	/*
		Il processo si mette in attesa per leggere dalla coda
	*/
	while(1) {

		/* viene impostato l'allarme che scatta dopo 30 secondi */
		alarm(30);

		/*
			la system call msgrcv riceve i messaggi dalla coda msgid e li
			memorizza nel buffer m.
			Il terzo parametro della funzione rappresenta la dimensione
			del messaggio ad esclusione dello spazio necessario a contenere
			il campo mtype della struttura.
			Il quarto parametro indica che devono essere letti solo i messaggi
			con message type MSGTYPE.
			L'ultimo parametro indica che il processo deve rimanere in attesa
			se non ci sono messaggi nella coda.
			Vedere man msgrcv.
		*/
		if(msgrcv(msgid, m, sizeof(message) - sizeof(m->mtype), MSGTYPE, 0) == -1) {
			perror("msgrcv");
			msgctl(msgid, IPC_RMID, NULL);
			exit(1);
		}

		/*
			ogni volta che viene letto un messaggio l'allarme deve
			essere disattivato per evitare che scatti impropriamente
		*/
		alarm(0);

		/* stampa a video del contenuto del messaggio */
		printf("mtype = %ld\n", m->mtype);
		printf("il messaggio è = %s\n", m->mex);
		
		printf("\n\n *** ***\n\n");
	}

}
Ultima modifica di JordanDunk il giovedì 22 giugno 2017, 19:33, modificato 1 volta in totale.
JordanDunk
Prode Principiante
Messaggi: 55
Iscrizione: lunedì 24 aprile 2017, 15:48
Desktop: Ubuntu
Distribuzione: Ubunto 16.10 | x86_64
Sesso: Maschile

Re: problema System Call code di messaggi

Messaggio da JordanDunk »

In poche parole vorrei riuscire a scegliere se mandare il messagio al server o al client2
JordanDunk
Prode Principiante
Messaggi: 55
Iscrizione: lunedì 24 aprile 2017, 15:48
Desktop: Ubuntu
Distribuzione: Ubunto 16.10 | x86_64
Sesso: Maschile

Re: problema System Call code di messaggi

Messaggio da JordanDunk »

risolto, bastava inserire apertura della coda di messaggi corrispondente
alla chiave MSGKEY
*/
if((msgid = msgget(MSGKEY, 0666)) == -1) {
perror("Apertura della coda di messaggi fallita.\n");
exit(1);
}

/*

nel client2
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 13 ospiti