Чтобы упростить, это ситуация, когда NamedPipe SERVER ожидает, что КЛИЕНТ NamedPipe будет писать в трубу (используя WriteFile())
В Windows API, который блокируется, является ReadFile()
Сервер создал синхронный канал (без перекрытия ввода-вывода) с включенной блокировкой
Клиент подключился, и теперь сервер ждет некоторых данных.
В обычном потоке вещей клиент отправляет некоторые данные, а сервер обрабатывает их, а затем возвращается в ReadFile(), чтобы дождаться следующего фрагмента данных.
Между тем происходит событие (например, пользовательский ввод), и NamedPipe SERVER должен выполнить другой код, который он не может сделать, пока блокирует ReadFile().
В этот момент я должен упомянуть, что клиент NamedPipe не является моим приложением, поэтому я не контролирую его. Я не могу заставить его отправить несколько байтов, чтобы разблокировать сервер. Он просто сидит и не посылает никаких данных. Поскольку я не контролирую реализацию Клиента, я ничего не могу изменить с этой целью.
Одним из решений было бы создать отдельный поток, в котором выполняются все операции ReadFile(). Таким образом, когда событие происходит, я могу просто обработать код. Проблема в том, что для события также требуется отдельный поток, поэтому теперь у меня есть два дополнительных потока для каждого экземпляра этого сервера. Поскольку это должно быть масштабируемым, это нежелательно.
Из другого потока, который я пробовал, звонил
DisconnectNamedPipe()
и
CloseHandle()
оба они не вернутся (пока клиент не напишет в трубку.)
Я не могу подключиться к одному и тому же каналу и написать несколько байтов, потому что:
"Все экземпляры именованного канала имеют одинаковое имя канала, но каждый экземпляр имеет его собственные буферы и дескрипторы и предоставляет отдельный канал для клиента/сервера связь ".
http://msdn.microsoft.com/en-us/library/aa365590.aspx
Мне нужен способ подделать его, поэтому вопрос стоимостью $64 000 долларов:
Как я могу разбить блокировку ReadFile()?