Перекрытое сообщение с именованным каналом, ERROR_MORE_DATA и CancelIoEx - PullRequest
0 голосов
/ 27 марта 2012

Я впервые использую $ SUB и столкнулся с этой проблемой.И клиент, и сервер используют перекрывающиеся операции, и вот конкретная ситуация, с которой у меня проблема.

Клиент

C1.Подключается к серверу.
C2.Посылает сообщение больше, чем конвейерный буфер, и буфер передается в перекрывающуюся операцию чтения на сервере.
C3.Успешно отменяет операцию отправки.

Сервер

S1.Создает и ждет клиента.
S2.Когда клиент подключен, он читает сообщение.
S21.Поскольку сообщение не помещается в буфер (ERROR_MORE_DATA), оно читается по частям.

Мне кажется, что нет способа определить, когда сообщение целиком, как изолированная единицаОтмененоВ частности, если клиент отменяет операцию отправки, сервер не получает все сообщение, только его часть, и последующая операция чтения возвращается с ERROR_IO_PENDING (в моем случае), что означает, что нет данных для чтения, и операция чтения имеетбыл в очереди.Я ожидаю, что у меня будут какие-то средства, чтобы сообщить читателю, что сообщение было отменено, чтобы читатель мог действовать в соответствии с ним.

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

1 Ответ

0 голосов
/ 27 марта 2012

Вы правы, невозможно сказать.

Если вы отмените запись файла на полпути, будет написана только часть сообщения, поэтому только эта часть будет прочитана сервером. Не передается «бухгалтерская» информация о том, насколько большим должно было быть сообщение до того, как вы его отменили - отправляются только необработанные данные.

Поэтому ответ таков: не отменяйте ввод-вывод, просто подождите, пока он завершится успешно.

Если вам делать необходимо отменить ввод-вывод на полпути, вам, вероятно, следует разорвать соединение и начать заново с самого начала, так же, как при отключении сети.

(Вы можете проверить свою ПЕРЕКРЫТУЮ структуру, чтобы узнать, сколько на самом деле было написано, и продолжить оттуда, но если вы захотите это сделать, вы, вероятно, просто не отмените IO.)

Почему вы все равно хотели отменить ввод-вывод? Какие обстоятельства вызывают это требование?

...