Я застрял здесь, пожалуйста, помогите.
У меня есть 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.
Трубный буфер заполнен? Я продолжаю читать из канала на стороне сервера.
Большое спасибо!