32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
|
|||||||||||
1 | |||||||||||
Как правильно использовать SSL_read при условии неблокируемого сокета12.01.2020, 16:42. Показов 3594. Ответов 8
Метки нет (Все метки)
В мануале написано
https://www.openssl.org/docs/m... _read.html
И в конечном итоге картина выглядит примерно следующим образом
1) select в данном случае абсолютно бесполезен, так как даже если данные для считывания есть, то SSL_read() все равно может возвращать ошибку SSL_ERROR_WANT_READ, так как имеющихся данных ему может не хватить. 2) При условии медленного интернета или медленного сайта, на открытие одной страницы количество срабатываний continue; может доходить до 1000 и более итераций, что весьма неплохо грузит процессор. Единственный выход который я нашел это сделать перед continue; слип на 10 миллисекунд, но уверен что такая реализация равносильна идиотизму, подскажите как реализовать чтение правильно? нигде в гугле нормального примера не нашел.
0
|
12.01.2020, 16:42 | |
Ответы с готовыми решениями:
8
Как правильно использовать логические операции в условии оператора if? Как найти для этих условии 2 парных чисел а и b при котором выполняется все условии? как объявить правильно tr и как его использовать при вызове функции? Как правильно создать объект сокета? |
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
12.01.2020, 19:30 | 2 |
В таком виде - это и есть правильное чтение. В общих чертах.
А вот не работать нормально это может у вас по разным причинам. Нюансов много, если не работает, значит ошибка в этих нюансах. Чтобы конкретно что-то сказать, надо видеть как именно у вас организован процесс.
0
|
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
|
||||||
15.01.2020, 14:18 [ТС] | 3 | |||||
Организован также как и в примере выше, вот более конкретный код
0
|
174 / 170 / 19
Регистрация: 31.08.2010
Сообщений: 574
|
|
19.01.2020, 19:37 | 4 |
Рекомендую посмотреть этот код:
https://metacpan.org/source/ML... e.pm#L2083 код на Perl, но думаю должно быть понятно
0
|
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
|
|
21.01.2020, 19:45 [ТС] | 5 |
Сказать честно, вообще ничего не понятно, но судя по количеству кода, врятли там есть что-то рабочее
Добавлено через 15 минут Тут проблема в следующем, WSAEventSelect ждет когда в сокет придет хоть что-то, и этого что-то может быть мало для расшифровки пакета, и SSL_read возвращает ошибку, тоесть мне нужно ждать пока в сокет не прийдет данных которых достаточно для расшифровки. Отсюда два вопроса, сколько нужно байт для расшифровки, и можно ли как-то сделать ожидание определенного количества байт?
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
21.01.2020, 21:52 | 6 |
WSAEventSelect ничего не ждет. Он связывает Event с сокетом для ожидания конкретных указанных событий на нем.
Само по себе ожидание выполняется функцией WSAWaitForMultipleEvents. Почему оно ожидает два события? Что это за второе событие из представленного кода не понятно. Также не вижу у вас в коде вызова WSAEnumNetworkEvents, для определения какое именно произошло событие на сокете. Еще не очень понятно зачем каждый раз устанавливать и сбрасывать событие через WSAEventSelect. В типичной ситуации его достаточно сделать один раз. https://www.openssl.org/docs/m... nding.html Пока что впечатление от кода не очень хорошие. Я бы начала с того, что переписал бы этот кусок аккуратно, с декомпозицией на подзадачи. Попробуйте переписать ваш код, руководствуясь этим примером: https://github.com/Andersbakke... ad_write.c
0
|
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
|
|
22.01.2020, 11:33 [ТС] | 7 |
Второе событие прерывает ожидание, например тайм аут 60 сек, сайт / прокси / интернет завис или очень медленно работает, а я захотел остановить поток, я нажимаю кнопку стоп, и посылается сигнал stopEvent чтобы прервать ожидание и работа моментально и корректно прерывается.
не вижу в нем смысла, всего 2 события, в массиве их по очередность не меняется, WSAWaitForMultipleEvents возвращает либо ошибку, либо номер события которое произошло, в данном случае это 0 и 1. WSAEventSelect захватывает сокет и принудительно переводит его в неблокирующий режим, тоесть если я его не освобожу WSAEventSelect(lp_current_conection->handleSocket, hEventRead, 0 ) то дальнейшие операции (например закрыть хендл, перевести в блокирующий режим и прочее) я с ним провести не смогу. =========== За полный пример спасибо, пойду изучу
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
22.01.2020, 12:51 | 8 |
Событий на сокете больше одного. Помимо READ, может быть еще CLOSE, также так может быть возвращена ошибка, непосредственно произошедшая в момент чтения.
Короче, я бы оставил WSAEnumNetworkEvents на месте. Не совсем понимаю, зачем вам намеренно упрощать пример, лишая себя дифференциальной диагностики того, что происходит.
0
|
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
|
|
27.01.2020, 13:36 [ТС] | 9 |
меня другие сообщения не интересуют вообще, есть данные - хорошо, любой другой ответ -ошибка.
Потестил я ваш пример, все работает но все равно циклов слишком много, если открывать одну страницу, то не заметно, если зациклить это дело, то имеется постоянная и немалая нагрузка на процессор, в случае с таймером нагрузки нет, и страница загружается примерно с той-же скоростью. Наверно нужно искать решение где-то в другом месте, например самому считывать из сокета, проверять длину и самому отправлять данные на расшифровку, нет у вас такого примера? я искал - ненашел
0
|
27.01.2020, 13:36 | |
27.01.2020, 13:36 | |
Помогаю со студенческими работами здесь
9
Read(). Как правильно прочитать из сокета? Как использовать ASCII value в условии Как правильно использовать operator= при наследовании в полиморфных и неполиморфных классах Общие подходы при создании игры: как правильно использовать графику? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |