Разрешает ли accept() на стороне сервера разблокировку каждого HTTPS-запроса от клиента?

У меня проблема с выполнением HTTPS-запросов от клиента к серверу.

Мой сервер использует Winsock с OpenSSL поверх сокетов, в то время как мой клиент использует библиотеку WinHttp. Все это сделано в C.

Ниже приведено описание того, что произошло (или как я понял) на сервере и клиенте во время сетевого взаимодействия:

На стороне сервера приложение блокируется в методе accept() во время ожидания соединения с клиентом. При первом HTTP-запросе, сделанном клиентом с помощью WinHttpSendRequest(), accept() разблокирует и создает новый поток. Затем accept() снова перешел в состояние блокировки, пока к нему не подключился новый клиент.

В потоке на стороне сервера recv() получает пакет, отправленный клиентом, затем отправляет ответный пакет с помощью send().

После получения ответного пакета от сервера WinHttpSendRequest () на стороне клиента разблокируется, прежде чем перейти к выполнению WinHttpReceiveResponse() и остальной части кода для чтения содержимого содержимого ответного пакета.

Между тем, recv() на стороне сервера блокируется, пока клиент не отправит другой запрос через WinHttpSendRequest(), и это будет продолжаться до тех пор, пока сервер не отправит команду завершить работу клиента.

Этот механизм использования Winsock на стороне сервера и WinHttp на стороне клиента работает для отправки нескольких HTTP-запросов от клиента к серверу через одно и то же соединение.

Тем не менее, когда я решил добавить слой шифрования для этой сети связи, т.е. клиент отправляет HTTPS вместо HTTP-запросов, а сервер использует функции openSSL для получения и отправки пакетов (SSL_read() вместо recv() и SSL_write вместо send()), каждый раз, когда клиент делает WinHttpSendRequest(), accept() на стороне сервера разблокирует и вернет новый сокет. В предыдущем сценарии, где шифрование не было выполнено и запросы были HTTP, accept() на стороне сервера разблокируется только тогда, когда это первый запрос, сделанный новым клиентом; последующие запросы того же клиента будут получены через блокировку и разблокировку recv().

Несколько замечаний: для моей клиентской стороны я оставил открытыми дескрипторы для WinHttpOpen и WinHttpConnect, в то время как дескрипторы WinHttpOpenRequest и WinHttpSendRequest будут закрываться после каждого запроса и пересозданы для каждого нового запроса. Кроме того, пакеты, полученные для обеих сторон, могут быть правильно прочитаны после шифрования (я знаю, что шифрование было выполнено, поскольку пакеты, прослушиваемые Wireshark, не читаются).

Я искал по всему интернету, чтобы узнать, испытывал ли кто-нибудь то же самое, но безрезультатно:(Есть ли кто-нибудь, кто может объяснить мне, почему это происходит?

0 ответов

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