Поддерживает ли Http.sys полнодуплексную связь?

Это возможно? Можем ли мы получить доступ к базовому сокету, который используется http.sys для ответа на данный запрос. Я хочу иметь возможность поддерживать полнодуплексную связь по протоколу http на порт 80.

Есть ли способ получить установленный сокет для текущего запроса и сохранить его для полнодуплексной связи?

Мой пример использования - это веб-сокеты. Рукопожатие веб-сокета - это действительный http-запрос, и я хотел бы повторно использовать мой веб-сервер для его обновления. Другой порт может быть не открыт на клиентском компьютере, поэтому порт 80 имеет жизненно важное значение.

Любые альтернативы приветствуются.

1 ответ

Решение

С http.sys у вас нет доступа к базовому сокету. Вы можете обрабатывать запросы http и создавать ответы из фрагментов (из кэша фрагментов, памяти или файлов). Если вам нужен полный контроль над используемым сокетом (начните с http-запроса, затем обновите его до сокета websocket после того, как "secret-websocket-handshake" не поддерживается).

Что вы можете сделать, это: использовать ракеты, как полнодуплексная система. Клиенты отправляют запросы с использованием HTTP 1.1, оставляя активными сокеты, и когда сервер http.sys получает эти запросы, вы можете отложить ответ до тех пор, пока не сработают данные, инициированные сервером, или не истечет время ожидания. Это не так надежно, как веб-сокет, но работает достаточно хорошо и добавляет время реакции сервера только на одну или две мс (по крайней мере, в моих тестах). Единственные проблемы возникают, когда кто-то открывает несколько страниц в браузере на сервере, и браузер начинает разрешать страницам совместно использовать один http-запрос. Для этого мы сохранили максимальный опрос на максимально низком уровне, что дает значительно больший веб-трафик.

Другой вариант заключался в том, чтобы сделать websocket самостоятельно в "коде сокета" и запросах http, используя "код http.sys". Это также работает достаточно хорошо, но делает код более сложным.

Другие вопросы по тегам