Domanda

un server pipa denominata viene creato con

hPipe = CreateNamedPipe( zPipePath,
                         PIPE_ACCESS_DUPLEX,
                         PIPE_TYPE_BYTE | PIPE_WAIT | PIPE_READMODE_BYTE,
                         PIPE_UNLIMITED_INSTANCES,
                         8192, 8192, NMPWAIT_USE_DEFAULT_WAIT, NULL)

Poi abbiamo subito chiamiamo:

ConnectNamedPipe( hPipe, BYVAL %NULL )

Il che blocca fino a quando il client si connette.

Poi ci siamo diretti verso ReadFile (hPipe, ...

Il problema è che ci vuole il cliente prende una quantità finita di tempo per preparare e scrivere tutti i parametri di richiesta fcgi. Questo non è di solito completata prima che il server esegue il suo tubo ReadFile (). L'operazione di file letto trova così non ci sono dati nel tubo e il processo non riesce.

Esiste un meccanismo per dire quando si è verificato un Write () / terminato dopo che un cliente ha collegato ad un NamedPipe?

Se ho avuto il controllo del processo client, potrei usare un mutex comune, ma non lo faccio, e io davvero non voglio entrare in porte I completamento / O solo per risolvere questo problema!

Posso naturalmente utilizzare un timer semplice aspettare 60 m / s o giù di lì che di solito è un sacco di tempo per la scrittura per completare, ma che è un hack orribile.

È stato utile?

Soluzione

Non sono sicuro di quale lingua si sta utilizzando - non riconosco l'espressione come

PIPE_TYPE_BYTE OR %PIPE_WAIT OR %PIPE_READMODE_BYTE

ma sembra a me che ReadFile del server () dovrebbe bloccare fino a quando i dati vengono scritti dal cliente.

Una cosa che non guarda a destra (ma non dovrebbe essere male qualsiasi cosa) è l'uso di NMPWAIT_USE_DEFAULT_WAIT -. Che il valore è destinato all'uso di un cliente al momento della chiamata WaitNamedPipe()

Potresti vedere se questi 2 programmi C ++ interagiscono come ci si aspetta (es., Con il server bloccando finché il client scrive qualcosa)? Ho preso questi programmi dal libro Jones / Ohlund "Programmazione di rete per Windows" I blocchi del server nella chiamata ReadFile() per me come previsto:

- server.cpp

// Server.cpp

#include <windows.h>
#include <stdio.h>

void main(void)
{
    HANDLE PipeHandle;
    DWORD BytesRead;
    CHAR buffer[256];
    if ((PipeHandle = CreateNamedPipe("\\\\.\\Pipe\\Jim",
        PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 1,
        0, 0, 1000, NULL)) == INVALID_HANDLE_VALUE)
    {
        printf("CreateNamedPipe failed with error %d\n",
            GetLastError());
        return;
    }

    printf("Server is now running\n");

    if (ConnectNamedPipe(PipeHandle, NULL) == 0)
    {
        printf("ConnectNamedPipe failed with error %d\n",
            GetLastError());
        CloseHandle(PipeHandle);
        return;
    }

    if (ReadFile(PipeHandle, buffer, sizeof(buffer),
        &BytesRead,  NULL) <= 0)
    {
        printf("ReadFile failed with error %d\n", GetLastError());
        CloseHandle(PipeHandle);
        return;
    }

    printf("%.*s\n", BytesRead, buffer);

    if (DisconnectNamedPipe(PipeHandle) == 0)
    {
        printf("DisconnectNamedPipe failed with error %d\n",
            GetLastError());
        return;
    }

    CloseHandle(PipeHandle);
}

- client.cpp

// Client.cpp

#include <windows.h>
#include <stdio.h>

#define PIPE_NAME "\\\\.\\Pipe\\jim"

void main(void)
{
    HANDLE PipeHandle;
    DWORD BytesWritten;

    if (WaitNamedPipe(PIPE_NAME, NMPWAIT_WAIT_FOREVER) == 0)
    {
        printf("WaitNamedPipe failed with error %d\n",
            GetLastError());
        return;
    }

    // Create the named pipe file handle
    if ((PipeHandle = CreateFile(PIPE_NAME,
        GENERIC_READ | GENERIC_WRITE, 0,
        (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        (HANDLE) NULL)) == INVALID_HANDLE_VALUE)
    {
        printf("CreateFile failed with error %d\n", GetLastError());
        return;
    }

    if (WriteFile(PipeHandle, "This is a test", 14, &BytesWritten, 
        NULL) == 0)
    {
        printf("WriteFile failed with error %d\n", GetLastError());
        CloseHandle(PipeHandle);
        return;
    }

    printf("Wrote %d bytes", BytesWritten);

    CloseHandle(PipeHandle);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top