Блоки WriteFile () (запись с клиента C ++ на сервер C # через именованный канал) - PullRequest
2 голосов
/ 18 мая 2011

Я застрял здесь, пожалуйста, помогите. У меня есть C # сервер именованных каналов, канал создается с помощью:

new NamedPipeServerStream(pipeName, PipeDirection.InOut, numThreads);

В C ++ я создал клиента так:

        m_hPipe = CreateFile( 
        strPipeName,            // Pipe name 
        GENERIC_READ |  GENERIC_WRITE,  // Read and write access 
        0,              // No sharing 
        NULL,               // Default security attributes
        OPEN_EXISTING,          // Opens existing pipe 
        FILE_FLAG_OVERLAPPED,    
        NULL);  

Я установил тип трубы на PIPE_READMODE_BYTE | PIPE_TYPE_BYTE
Я написал функцию WriteString () для записи строки в канал. Функция примерно такая:

    // Write the length of the string to the pipe (using 2 bytes)
    bool bResult = WriteFile(m_hPipe, buf, 2, &cbBytesWritten, NULL);

    // Write the string itself to the pipe
    bResult = WriteFile(m_hPipe, m_chSend, len, &cbBytesWritten, NULL);

    // Flush the buffer
    FlushFileBuffers(m_hPipe);

Я сделал два вызова функции:

    WriteString(_T("hello server!"));   // message sent and the server saw it correctly
    WriteString(_T("goodbye server!")); // message not sent, coz WriteFile() blocked here

Теперь проблема в том, что программа блокируется при первом вызове WriteFile () во втором вызове WriteString (). Только когда канал закрыт сервером, функция WriteFile () может вернуться с ошибкой.

Это надежно воспроизводится.

Что здесь блокирует вызов WriteFile ()? Я уже использую флаг файла OVERLAPPED. Трубный буфер заполнен? Я продолжаю читать из канала на стороне сервера.

Большое спасибо!

1 Ответ

3 голосов
/ 18 мая 2011

FILE_FLAG_OVERLAPPED включает асинхронный ввод / вывод.Он не делает автоматически какие-либо операции асинхронными, неблокирующими или буферизированными.

Вам необходимо использовать 5-й параметр WriteFile - передать в структуру OVERLAPPED, либо с событием, которое устанавливается по завершенииили связать дескриптор файла с портом завершения ввода / вывода .

...