tomminno
24-01-2007, 22:16
Ho un problema con la scrittura su una Named Pipe.
Il server crea una Named Pipe per la lettura e scrittura e attende una connessione, ricevuta la connessione invia una serie di dati al client poi si blocca in attesa di una comunicazione da parte del client. Fin qui tutto bene.
Il client apre la named pipe in lettura/scrittura e riceve correttamente i dati inviati dal server. Poi però quando accade l'evento che comporta la scrittura sulla pipe, la WriteFile si blocca e non restituisce niente.
Solo quando termino il programma client i dati arrivano al server.
Immagino quindi di star utilizzando in maniera sbagliata le pipe.
Lo schema che ho adottato è il seguente:
/*SERVER*/
hPipe = CreateNamedPipe ( pipename, PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE |
PIPE_READMODE_MESSAGE |
PIPE_WAIT,
PIPE_UNLIMITED_INSTANCES,
BUFSIZE,
BUFSIZE,
PIPE_TIMEOUT,
NULL);
if(ConnectNamedPipe(hPipe, NULL))
{
CreateNewPipe();//Per consentire eventuali altre comunicazioni da altri processi
WriteFile(hPipe, msg.c_str(), msg.length(), &dwWrite, NULL);
while(ReadFile (hPipe, chRequest, BUFSIZE, &cbBytesRead, NULL) )
{
//Attendi fine comunicazione da parte del client.
}
/*CLIENT*/
hPipe = CreateFile(pipename, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
//In un thread a parte c'è il codice:
while(ReadFile (hPipe, chRequest, BUFSIZE, &cbBytesRead, NULL) )
{
//Acquisisci tutti i dati provenienti dal server
}
//In un altro thread c'è la parte che non funziona
BOOL flg = WriteFile(hPipe, msg.c_str(), msg.length(), &dwWrite, NULL);
Proprio quest'ultima WriteFile non restituisce mai il controllo. I dati arrivano al server solo quando il programma client viene terminato.
C'è qualche altra operazione da fare tra una lettura e scrittura sullo stesso HANDLE hPipe?
Il server crea una Named Pipe per la lettura e scrittura e attende una connessione, ricevuta la connessione invia una serie di dati al client poi si blocca in attesa di una comunicazione da parte del client. Fin qui tutto bene.
Il client apre la named pipe in lettura/scrittura e riceve correttamente i dati inviati dal server. Poi però quando accade l'evento che comporta la scrittura sulla pipe, la WriteFile si blocca e non restituisce niente.
Solo quando termino il programma client i dati arrivano al server.
Immagino quindi di star utilizzando in maniera sbagliata le pipe.
Lo schema che ho adottato è il seguente:
/*SERVER*/
hPipe = CreateNamedPipe ( pipename, PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE |
PIPE_READMODE_MESSAGE |
PIPE_WAIT,
PIPE_UNLIMITED_INSTANCES,
BUFSIZE,
BUFSIZE,
PIPE_TIMEOUT,
NULL);
if(ConnectNamedPipe(hPipe, NULL))
{
CreateNewPipe();//Per consentire eventuali altre comunicazioni da altri processi
WriteFile(hPipe, msg.c_str(), msg.length(), &dwWrite, NULL);
while(ReadFile (hPipe, chRequest, BUFSIZE, &cbBytesRead, NULL) )
{
//Attendi fine comunicazione da parte del client.
}
/*CLIENT*/
hPipe = CreateFile(pipename, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
//In un thread a parte c'è il codice:
while(ReadFile (hPipe, chRequest, BUFSIZE, &cbBytesRead, NULL) )
{
//Acquisisci tutti i dati provenienti dal server
}
//In un altro thread c'è la parte che non funziona
BOOL flg = WriteFile(hPipe, msg.c_str(), msg.length(), &dwWrite, NULL);
Proprio quest'ultima WriteFile non restituisce mai il controllo. I dati arrivano al server solo quando il programma client viene terminato.
C'è qualche altra operazione da fare tra una lettura e scrittura sullo stesso HANDLE hPipe?