Sto scrivendo un'applicazione client-server che fa uso di mailslot, il processo client passa una stringa al server e questo deve scrivere tale stringa su un file.
Ho questo problema, il server crea il file su cui scrivere, ma il file resta vuoto.
La stringa viene passata correttamente, tant'è che se al processo server la faccio stampare sulla console non ho problemi... perché questa stringa non la scrive sul file?
Ecco il codice del server:
codice:
#include <windows.h>
#include <stdio.h>
#define ErroreIO -1
int main(int argc,char **argv)
{
HANDLE handle;
LPCTSTR errMsg, FileDaScrivere = "output.txt";
FILE *uscita;
/* Crea il mailslot */
handle = CreateMailslot("\\\\.\\mailslot\\blort",
0,
MAILSLOT_WAIT_FOREVER,
NULL);
if (handle == INVALID_HANDLE_VALUE)
{
TCHAR strError[256];
errMsg = "CreateMailslot ha fallito: %s";
print_err:
// Prende il messaggio d'errore da Windows associato al numero d'errore
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
&strError[0], 256, 0);
// Visualizza l'errore
printf(errMsg, &strError[0]);
// Chiude i mailslot aperti
if (handle != INVALID_HANDLE_VALUE) CloseHandle(handle);
return(-1);
}
while(1)
{
DWORD msgSize;
BOOL err;
uscita = fopen(FileDaScrivere,"w");
if(uscita == NULL)
return ErroreIO;
/* Prende la dimensione del prossimo record */
err = GetMailslotInfo(handle, 0, &msgSize, 0, 0);
/* Controlla se c'è un errore */
if (!err)
{
errMsg = "GetMailslotInfo failed: %s";
goto print_err;
}
/* Controllo se msgSize è nullo */
if (msgSize != (DWORD)MAILSLOT_NO_MESSAGE)
{
void * buffer;
/* Allocazione di memoria */
buffer = GlobalAlloc(GMEM_FIXED, msgSize);
if (!buffer) printf("Errore allocazione del blocco di memoria!");
else
{
DWORD numRead;
/* legge il record */
err = ReadFile(handle, buffer, msgSize, &numRead, 0);
/* Controlla se c'è un errore */
if (!err) printf("ReadFile error: %d", GetLastError());
/* Mi assicuro di aver letto tutti i bytes */
else if (msgSize != numRead)
printf("ReadFile non ha letto il giusto numero di bytes!");
else
{
/***********************************
***********************************
Qui sotto le stampe su console e su file
***********************************
***********************************/
// bufer contiene la stringa
printf(buffer); //scrive sulla console il cont. di buffer
pririntf(uscita,buffer); //non scrive sul file
}
/* Libero il buffer */
GlobalFree(buffer);
}
}
/* pausa */
Sleep(1000);
}
return(0);
}