У меня есть некоторые сомнения относительно порта завершения ввода-вывода, а также AcceptEx в winsock2
Пожалуйста, поправьте меня, если я ошибаюсь.
AcceptEx - это перекрывающийся способ приема запросов или подключения. Однако, как указано в нескольких сообщениях на этом сайте,
AcceptEx
подвержен атаке DOS, если AcceptEx ожидает данные, но не отправляется подключенным клиентом. Итак, можно ли решить эту проблему, просто поставив 0 вdwReceiveDataLength
?Кроме того, каковы преимущества возможности получать данные от клиента при принятии соответствующего подключения, а не получать данные позже с помощью
AcceptEx
?После приема соединений от противоположной конечной точки и связывания ее с портом завершения ввода-вывода запросы ставятся в очередь в порте завершения ввода-вывода как пакеты завершения, которые связаны с их соответствующим дескриптором. Рабочие потоки, которые блокируют порт завершения, будут разбужены в зависимости от
NumberOfConcurrentThreads
для обслуживания запросов. Итак, являются ли потоки в порту завершения потоками ввода-вывода?Итак, где мне реализовать бизнес-логику или операцию на сервере сокетов? Например, запрос от клиента, который отправляет числа на сервер для обработки, в то время как сервер действует как калькулятор, который в ответ возвращает вычисленный результат. Таким образом, можно ли реализовать эту логику в Порте завершения ввода-вывода?
Если логика реализована в порте завершения ввода-вывода (когда потоки ввода-вывода (предполагается), которые активны в порте завершения ввода-вывода, выполняют
WSARecv
илиWSASend
)), будет ли блок потоки ввода-вывода в ожидании завершения расчета, что делает невозможным подключение, если все невыполненные задания выполнены?
ИЗМЕНИТЬ:
- Например, после принятия клиентского сокета и добавления в очередь / связывания с портом завершения ввода-вывода (main_cpl_port) потоки, которые блокируют этот main_cpl_port em > вызовите
GetQueuedCompletionStatus
для удаления пакета завершения и последующего чтения данных в выделенный буфер. Перед тем, как какой-либо ответ будет записан обратно клиенту, буфер обрабатывается / анализируется на предмет «команды» (например: GoToCalculator, GoToRecorder). - Например, GoToCalculator отвечает за другие команды, связанные с расчетами.
- В этом случае GoToCalculator на самом деле является еще одним портом завершения ввода-вывода, который обслуживает все запросы, связанные с вычислениями. Допустим, порт завершения называется calc_completion_port.
- Таким образом, возможно ли, что пакет завершения из main_cpl_port будет отправлен в calc_completion_port для будущего ввода-вывода (отправка и recv) из клиентского сокета, который в настоящее время связан с main_cpl_port. Это то, для чего используется
PostQueuedCompletionStatus
? - Может ли сообщение, отправленное клиентом после отправки на calc_completion_port, потоки, которые блокируют этот порт завершения? Другими словами, как я могу перенаправить соединение на другой порт завершения с другого?