В моей программе (помещенной в этот вопрос), я сделал следующие изменения на стороне клиента:
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
. Поскольку содержимое буфера перезаписывается каждый раз, сервер должен получить последнее сообщение, которое было записано в буфер. Но сервер получает сообщения без каких-либо проблем.
Означает ли это, что сообщение сначала копируется в некоторый внутренний буфер? Можно ли уничтожить буфер и ожидать, что сообщение будет доставлено на сервер?
Опять процитировать MSDN:
lpBuffer [in] Указатель на буфер, содержащий данные, которые должны быть записаны в файл или устройство. Этот буфер должен оставаться в силе во время операции записи. Вызывающий не должен использовать этот буфер до завершения операции записи.
Таким образом, кажется, что ваши сообщения не гарантированно прибывают безопасно, если вы возитесь с буфером во время операции записи. Вы не должны уничтожать буфер
Ваш код по существу использует неопределенное поведение. Из документации WriteFile:
Доступ к буферу вывода, когда операция записи использует буфер, может привести к повреждению данных, записанных из этого буфера. Приложения не должны записывать, перераспределять или освобождать выходной буфер, который использует операция записи, до завершения операции записи.
Как отмечает Раймонд Чен, появление успеха - неопределенное поведение
Неопределенное поведение означает, что все может случиться. Программа может немедленно сработать. Через пять минут он может потерпеть крах. Он мог бы отправить письмо вашему боссу, сказав, что вы напортачили, а затем прочитали стихи Vogon. А может и нет.
Ваш код может работать прямо сейчас, но он может просто перестать работать в какой-то момент в будущем. Это может быть из-за того, что вы создали в выпуске, или Microsoft меняет основные функции WriteFile
или случайные шансы.