Тупик с WriteFile / ReadFile - PullRequest
       23

Тупик с WriteFile / ReadFile

0 голосов
/ 14 октября 2011

Я использую каналы, и у меня возникла тупиковая ситуация на WriteFile / ReadFile.Вот мой код:

hProbePipeRet = CreateNamedPipe( 
          "\\\\.\\pipe\\probePipeRet", // pipe name 
          PIPE_ACCESS_DUPLEX,       // read/write access 
          PIPE_TYPE_MESSAGE |       // message type pipe 
          PIPE_READMODE_MESSAGE |   // message-read mode 
          PIPE_WAIT,                // blocking mode 
          PIPE_UNLIMITED_INSTANCES, // max. instances  
          BUFSIZE,                  // output buffer size 
          BUFSIZE,                  // input buffer size 
          5,                        // client time-out 
          NULL);                    // default security attribute 

Сначала я создаю свой канал, затем использую его следующим образом:

WriteFile( 
            hProbePipeRet,        // handle to pipe 
            msg.c_str(),     // buffer to write from 
            msg.size(), // number of bytes to write 
            &dwBytesWritten,   // number of bytes written 
            NULL);        // not overlapped I/O 

И я получаю его обратно с:

        fSuccess = ReadFile( 
            myInst->hProbePipeRet,        // handle to pipe 
            buf,    // buffer to receive data 
            BUFSIZE, // size of buffer 
            &dwBytesRead, // number of bytes read 
            NULL);        // not overlapped I/O 

Это очень просто, и у меня есть еще два канала, которые ТОЧНО выполняют одно и то же, единственное отличие состоит в том, что они находятся в другом потоке, но этот нужен мне только для базовых транзакций сообщения.

При первой попытке информация о каналах читается успешно, но со второй попытки, если я не отправлю хотя бы BUFSIZE данных, и WriteFile, и ReadFile будут заблокированы.Как я уже сказал, у меня есть еще два канала, которые выполняют одну и ту же функцию с одинаковыми функциями, и мне не нужно отправлять BUFSIZE данных для успешного взаимодействия.

РЕДАКТИРОВАТЬ: дополнительная информация

Выполнение происходит следующим образом: сообщение отправляется на сервер pipe1, сообщение принимается, а затем возвращает данные с помощью hProbePipeRet в моем проблемном коде.Данные читаются клиентом, выводятся на экран.

Другое сообщение отправляется с использованием pipe1, получено, и результат снова отправляется в hProbePipeRet, клиент ожидает как минимум BUFSIZE информации, и я не знаю, что делает сервер, но он заблокирован в WriteFile.

Этот сценарий аналогичен другим моим каналам, но я не помещаю hProbePipeRet в отдельный поток для чтения из него.Я делаю это, потому что мне нужен ответ сразу после отправки сообщения.

Ответы [ 2 ]

2 голосов
/ 14 октября 2011

Возможно, вы столкнулись с проблемой блокирования ввода-вывода.Вызов блока ReadFile блокируется до тех пор, пока не будет что прочитать.Если у вас есть цикл, который вызывает запись, а затем чтение, он может заблокироваться во втором вызове.Возможно, вам следует рассмотреть возможность использования async io.Вы вызываете readFile с событием.Событие устанавливается, когда есть что почитать.Таким образом, нет необходимости создавать несколько потоков.

0 голосов
/ 14 октября 2011

используйте PIPE_TYPE_BYTE и PIPE_READMODE_BYTE вместо счетчиков MESSAGE.Кроме того, сервер не должен выполнять какие-либо блокирующие операции чтения до того, как к нему подключится какой-либо клиент.

См. http://msdn.microsoft.com/en-us/library/windows/desktop/aa365150(v=vs.85).aspx

Редактировать: Для «не нужно выполнять какие-либо блокирующие операции чтения»: это может, согласнодокументация приводит к состоянию гонки, которое на самом деле может быть вашим случаем, однако трудно понять, не видя больше вашего кода.

...