Ho fatto una prova creando un client per la mailslot:
Client:
codice:
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
LPSTR lpszMessage = "Messaggio di prova per MailSlot.";
BOOL fResult;
HANDLE hFile;
DWORD cbWritten;
hFile = CreateFile("\\\\.\\mailslot\\blort",
GENERIC_WRITE,
FILE_SHARE_READ, // required to write to a mailslot
(LPSECURITY_ATTRIBUTES) NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
(HANDLE) NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("\s\n", "Errore nell'apertura della MailSlot");
return FALSE;
}
fResult = WriteFile(hFile,
lpszMessage,
(DWORD) lstrlen(lpszMessage) + 1, // include terminating null
&cbWritten,
(LPOVERLAPPED) NULL);
if (!fResult)
{
printf("\s\n", "Errore nell'invio del Messaggio");
return FALSE;
}
printf("\s\n", "Messaggio inviato!");
fResult = CloseHandle(hFile);
if (!fResult)
{
printf("\s\n", "Errore nella chiusura del file");
return FALSE;
}
return 0;
}
Server:
codice:
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE handle;
LPCTSTR errMsg;
FILE *uscita;
char FileDaScrivere[255] = "output.txt";
/* 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");
uscita = fopen(FileDaScrivere, "a+");
if(uscita == NULL)
return -1;
/* 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, NULL);
/* 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
***********************************
***********************************/
// buffer contiene la stringa
printf("%s\n", (char*)buffer); //scrive sulla console il cont. di buffer
fprintf(uscita, "%s\n", (char*)buffer); //non scrive sul file
}
/* Libero il buffer */
GlobalFree(buffer);
fclose(uscita);
}
}
/* pausa */
Sleep(1000);
}
return 0;
}
Cosi funziona. Il problema stava proprio nell'apertura del file con l'opzione "w" ( che ad ogni ciclo svuota il file, al contrario di "a+" che aggiunge i messaggi alla fine del file ).