Ciao ragazzi, vi posto tutto il codice del mio programmino (in realtà devo realizzarne un più corposo, questo ve l'ho fatto di esempio).
Il mio problema è molto semplice, quando mando con una msgsnd un messaggio (da cliente a servitore o il contrario) la msgrcv lo riceve correttamente ma, quando lo mando in stampa, scopro che l'int del messaggio (m.num o l.num) è sballato. Nel senso, se invio un messaggio con
tipo = RICH
mess = "Ciao!"
num = 123;
ricevo, a quanto pare
tipo = RICH
mess = "Ciao!"
num = 98979846; (un numero casuale)
secondo voi? ho pensato che sia un problema di puntatori, ma non capisco dove possa essere.
Codice:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/msg.h>
#include<sys/types.h>
#include <sys/ipc.h>
#include<sys/wait.h>
#include "fileheader.h"
typedef struct msg{
long tipo;
char mess[30];
int num;
} messaggio;
main(){
printf("\n.....:SERVITORE:.....\n");
int key = MYKEY;
int ric,inv,cod,padre,w8,i;
int grande = sizeof(int)+sizeof(char[20]);
char comando[30];
sprintf(comando,"./cliente&");
system(comando);
cod = msgget(key,IPC_CREAT | 0666);
padre=fork();
if(padre){
w8=wait(0);
printf("\n.....:SERVITOREND:.....\n");
msgctl(cod,IPC_RMID, 0);
}
else{ messaggio l;
ric = msgrcv(cod,&l,grande,RICH,0);
if (ric!=-1) { printf("\nSERVITORE Mess Ricevuto, rispondo. (%s|%d)\n",l.mess,l.num);
messaggio m = {RISP,"Sono servitore, ciao",444};
inv = msgsnd(cod,&m,grande,0);
if (inv==-1)printf("\nSERVITORE Errore invio\n");
else printf("\nSERVITORE Messaggio inviato! (%s|%d)\n",m.mess,m.num);
}
else printf("\nSERVITORE Mess Non Ricevuto\n");
}
}
Codice:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/msg.h>
#include<sys/types.h>
#include <sys/ipc.h>
#include<sys/wait.h>
#include "fileheader.h"
typedef struct msg{
long tipo;
char mess[20];
int num;
} messaggio;
main(){
printf("\n.....:CLIENTE:.....\n");
int key = MYKEY;
int ric,inv,cod,padre,w8,i;
int grande = sizeof(int)+sizeof(char[20]);
cod = msgget(key,IPC_CREAT | 0666);
padre=fork();
if (!padre){
messaggio m = {RICH,"Sono cliente, ciao",999};
inv = msgsnd(cod,&m,grande,0);
if (inv==-1)printf("\nCLIENTE ERRORE non inviato\n");
else printf("\nCLIENTE Messaggio inviato! (%s|%d)\n",m.mess,m.num);
messaggio l;
ric = msgrcv(cod,&l,grande,RISP,0);
if (ric==-1) printf("\nCLIENTE Messaggio non ricevuto");
else printf("\nCLIENTE Messaggio ricevuto (%s|%d)\n",l.mess,l.num);
}
else{ w8=wait(0);
printf("\n.....:CLIENTEND:.....\n");
}
}