32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
|
|||||||||||
1 | |||||||||||
Как правильно использовать SSL_read при условии неблокируемого сокета12.01.2020, 16:42. Показов 3599. Ответов 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= при наследовании в полиморфных и неполиморфных классах Общие подходы при создании игры: как правильно использовать графику? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Опции темы | |
|
Новые блоги и статьи | |||||
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства
Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
|
Что такое NullReferenceException и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
|
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
|
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
|
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
|
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
|
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее:
На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
|
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript
В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
|
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
|
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален
В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
|
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
|
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели
В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
|