Я ищу способ получить сигнал на порту завершения ввода-вывода, когда сокет становится читаемым/записываемым (т. Е. Следующий send/recv будет завершен немедленно). В принципе, я хочу перекрытую версию WSASelect
.Есть ли способ использовать IOCP для уведомления, когда сокет читается/записывается?
(Да, я знаю, что для многих приложений это необязательно, и вы можете просто продолжать выдавать перекрывающиеся вызовы send
. Но в других приложениях вы хотите отложить создание сообщения для отправки до последнего момента, как обсуждалось e.g. here В этих случаях полезно выполнить (a) дождаться, когда сокет будет записываться, (b) сгенерировать следующее сообщение, (c) отправить следующее сообщение.)
Пока лучшее решение, которое я смог придумайте, чтобы создать нить только для вызова select
, а затем PostQueuedCompletionStatus
, что ужасно и не особенно масштабируемо ... есть ли лучший способ?
вам не нужно все это. после подключения сокета он все время «записывается» и «читается». вы можете иметь множественную перекрывающуюся отправку по времени. однако только один recv-запрос во времени имеет смысл. вам нужно сделать recv сразу после подключения, а затем после завершения предыдущего recv. до разъединения. «будет немедленно завершено» - при использовании асинхронного io это не имеет смысла – RbMm
Мне это нужно и объяснил, почему в вопросе - это способ минимизировать буферизацию отправки для приложений, чувствительных к задержкам. (В качестве альтернативы я предполагаю, что было бы также хорошо, если бы был способ получить предупреждение, когда общий размер буфера отправки упал ниже некоторой отметки с низким уровнем воды, но я даже меньше надеюсь на это существующее ...) –
, когда отправка завершена - вы сообщили об этом. например, когда вам нужно отправить большие данные - вы можете отправить только кусок. когда передача этого фрагмента завершена - вы получили уведомление в IOCP об этом, и внутри этого уведомления - отправьте еще один фрагмент. и т. д. Я уже много раз делаю это – RbMm