WriteFile успешно, даже когда буфер перезаписан для ожидающей операции

0

В моей программе (помещенной в этот вопрос), я сделал следующие изменения на стороне клиента:

wretry:   
   cbToWrite = _stprintf(chBuf[0], TEXT("Message %d from Client"), retrycount - numberofsend + 1);
   cbToWrite *= sizeof(TCHAR);

   fSuccess = WriteFile(hPipe, chBuf[0], cbToWrite,
  &cbWritten, &woverlapped[retrycount-numberofsend]);

Таким образом, теперь тот же буфер будет использоваться для записи каждый раз.

В этом случае WriteFile выполняется каждый раз, когда возвращается ERROR_IO_PENDING. Поскольку содержимое буфера перезаписывается каждый раз, сервер должен получить последнее сообщение, которое было записано в буфер. Но сервер получает сообщения без каких-либо проблем.

Означает ли это, что сообщение сначала копируется в некоторый внутренний буфер? Можно ли уничтожить буфер и ожидать, что сообщение будет доставлено на сервер?

Теги:
winapi
named-pipes

2 ответа

4
Лучший ответ

Опять процитировать MSDN:

lpBuffer [in] Указатель на буфер, содержащий данные, которые должны быть записаны в файл или устройство. Этот буфер должен оставаться в силе во время операции записи. Вызывающий не должен использовать этот буфер до завершения операции записи.

Таким образом, кажется, что ваши сообщения не гарантированно прибывают безопасно, если вы возитесь с буфером во время операции записи. Вы не должны уничтожать буфер

  • 0
    Это то, что я знаю. Но в моем случае я получаю буферы в целости и сохранности. Почему я не понимаю проблемы?
  • 0
    Вполне возможно, что ваша операция записи завершится до того, как вы снова получите доступ к буферу (не могу точно знать, что предшествует чему), что скрывает проблему с вашим кодом. Кроме того, код, который использует оператор goto, крайне не рекомендуется на любом современном языке
Показать ещё 1 комментарий
1

Ваш код по существу использует неопределенное поведение. Из документации WriteFile:

Доступ к буферу вывода, когда операция записи использует буфер, может привести к повреждению данных, записанных из этого буфера. Приложения не должны записывать, перераспределять или освобождать выходной буфер, который использует операция записи, до завершения операции записи.

Как отмечает Раймонд Чен, появление успеха - неопределенное поведение

Неопределенное поведение означает, что все может случиться. Программа может немедленно сработать. Через пять минут он может потерпеть крах. Он мог бы отправить письмо вашему боссу, сказав, что вы напортачили, а затем прочитали стихи Vogon. А может и нет.

Ваш код может работать прямо сейчас, но он может просто перестать работать в какой-то момент в будущем. Это может быть из-за того, что вы создали в выпуске, или Microsoft меняет основные функции WriteFile или случайные шансы.

  • 1
    Я не удивлюсь, если функции Microsoft прочитают вам стихи Вогона. Кажется действительно уместным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню