PDA

Visualizza la versione completa : [C] Passaggio di un intero tramite mailslot


absgothic
25-01-2006, 17:39
Ciao a tutti,
sto realizzando un'applicazione costituita da 2 programmi client e server che comunicano tra loro.

Per effettuare un determinato controllo, ho bisogno che il server comunichi al client un codice composto da un solo numero di tipo int; nello specifico, se il controllo è andato a buon fine, il server comunica 2, altrimenti comunica 3.

lo scambio di questo codice di controllo avviene attraverso mailslot (non posso fare altrimenti), il server invia



int esitoBAD = 3;
int esitoGOOD = 2;

mailslotControllo = CreateMailslot("\\\\.\\mailslot\\controllo",TAGLIA,MAILSLOT_WAIT_FOREVER,NULL);

//in caso di esito negativo esegue l'istruzione
conferma1 = WriteFile(mailslotControllo, esitoBAD,sizeof(esitoBAD)+1, &scritti1, NULL);

//in caso di esito positivo
conferma3 = WriteFile(mailslotControllo, esitoGOOD,sizeof(esitoGOOD)+1, &scritti3, NULL);



il client in ricezione analizza il contenuto della mailslot e in dipendenza di esso inizializza una variabile. Tutto questo avviene eseguendo il seguente codice:



//in main...
prenotazione_esistente = CreateFile("\\\\.\\mailslot\\controllo", GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

hthread3 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thread controllaprenotazioni,
prenotazione_esistente,NORMAL_PRIORITY_CLASS,&threadcontrolloID);



void threadcontrollaprenotazioni(HANDLE mailslot)
{
BOOL esitoprenotazione;
int esito;
DWORD letti;

esitoprenotazione = ReadFile(mailslot, esito, TAGLIA, &letti, NULL);

printf("ho letto dalla mailslot di controllo\n");


printf("esito = %d\n", esito); //qui scopro l'errore!!

if (esito == 3)

var_controllo = 3;


else if (esito == 2)

var_controllo = 2;

}


(il client lancia un thread per analizzare il codice ricevuto dal server).

IL PROBLEMA E' QUESTO: il client non riceve affatto 2 o 3 dalla mailslot, ma dei numeri assurdi preceduti dal segno -
(ad esempio dove dovrebbe ricevere 3 riceve -858993460 !!)

Che cosa sbaglio? e come posso risolvere?

oregon
25-01-2006, 19:11
La variabile va passata per indirizzo ...

esitoprenotazione = ReadFile(mailslot, &esito, TAGLIA, &letti, NULL);

absgothic
25-01-2006, 21:02
se in ricezione al ReadFile metto & mi esce la finestra di Windows per gli errori e mi chiede di chiuderlo...

forse faccio un uso improprio di qualche funzione:
volendo scrivere un intero nella mailslot uso



WriteFile(HANDLEmailslot,intero,sizeof(intero), &scritti1,NULL);


giusto?
Ho qualche perplessità sul dover usare o meno "sizeof"...

in ricezione invece dovrei usare



ReadFile(HANDLEmailslot,&intero,MAXbyteLETTI,&read,NULL);


vero?

xchè nn funziona!?! :dhò:

oregon
25-01-2006, 21:21
Allora ...

Per la scrittura devi scrivere



WriteFile(HANDLEmailslot, &intero, sizeof(intero), &scritti, NULL);


Per la lettura



ReadFile(HANDLEmailslot, &intero, sizeof(intero), &letti, NULL);

Loading