Alhazred
12-07-2007, 18.59.15
Sto scrivendo un'applicazione Client-Server.
Ho questo problema, il processo client passa al server una stringa, la stringa arriva perché la printf la stampa sulla console, ma non riesco a farla scrivere su un file. Il file viene creato, ma resta vuoto.
Cosa mi sfugge?
#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 contenuto del buffer
fprintf(uscita,buffer); //non scrive sul file
}
/* Libero il buffer */
GlobalFree(buffer);
}
}
/* pausa */
Sleep(1000);
}
return(0);
}
Ho questo problema, il processo client passa al server una stringa, la stringa arriva perché la printf la stampa sulla console, ma non riesco a farla scrivere su un file. Il file viene creato, ma resta vuoto.
Cosa mi sfugge?
#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 contenuto del buffer
fprintf(uscita,buffer); //non scrive sul file
}
/* Libero il buffer */
GlobalFree(buffer);
}
}
/* pausa */
Sleep(1000);
}
return(0);
}