LINUX.ORG.RU

Если я правильно понимаю асинхронный клиент работает по сети в отдельном потоке при этом не тормозя пользовательский интерфейс, вот собственно и все.

Booster ★★
()
Ответ на: комментарий от Booster

Если бы только прием, или только передача, у меня же в любой момент может случиться и то и другое. Или можно в разных потоках принимать и пихать в один и тот же сокет?

Soyfer
() автор топика
Ответ на: комментарий от Soyfer

реакторы с пулерами не для того придумали и используют неблокирующие дескрипторы что бы это еще и на всякие потоки раскидывали, нахрена вы сразу усложняете простую задачу? ищете проблем себе в будущем? смотрите не десять шагов вперед

anonymous
()
Ответ на: комментарий от anonymous

Вполне возможно что я не знаю более очевидного решения, просвятите подробно пожалуйста.

Soyfer
() автор топика
Ответ на: комментарий от Soyfer

Не ну можно передачу и прием поместить в отдельные каналы/сокеты, но обычно они идут последовательно. Принимать и пихать в разных потоках в один сокет тоже возможно. Сокет это всего лишь адрес назначения, на параллельность никаких ограничений нет, можно хоть 100 потоков насоздавать и слать, принимать, только будет ли в этом смысл? Опиши задачу подробнее.

Booster ★★
()
Ответ на: комментарий от Booster

Реализовать (именно самому) Websocket с поддержкой ssl. По сути - обычный TCP асинхронный, только формат пакета особый.

Не ну можно передачу и прием поместить в отдельные каналы/сокеты, но обычно они идут последовательно.

Дважды подключаться? Продублировать сокет? Скорее всего, я не знаю каких то основ.

Soyfer
() автор топика
Ответ на: комментарий от Soyfer

Так в чем все-таки заключается асинхронность этого клиента? Если в раздельном приеме/посылке, то слать/принимать в отдельных потоках в один сокет никто не запрещает. anonymous имеет ввиду неблокирующие сокеты, которые не ждут пока придут/отправятся данные. Не думаю, что это связано с раздельными приемом/посылкой.

Booster ★★
()
Ответ на: комментарий от Soyfer

Да без проблем. Сокет принадлежит процессу, а не потоку и в пределах процесса его можно спокойно дергать из разных потоков. Только не понятно зачем это надо. Сервер также работает?

Booster ★★
()
Ответ на: комментарий от Booster

Сервер не мой. За совет спасибо, выглядит просто, странно что я не догадался.

Soyfer
() автор топика
Ответ на: комментарий от Soyfer

Есть или нет - тебе лучше знать, мы тонкостей этой задачи не знаем. Как я уже писал - обычно асинхронность понимается относительно пользовательского интерфейса, чтобы он не зависал. Но асинхронность разная бывает, на уровне приема/передачи тоже бывает. В общем гадание на кофейной гуще, пока не скажешь что конкретно понимается под асинхронностью.

Booster ★★
()
Ответ на: комментарий от Booster

В общем гадание на кофейной гуще, пока не скажешь что конкретно понимается под асинхронностью.

Я говорил выше, не могу заранее знать когда мне придет пакет, и не могу заранее знать когда нужно будет его отправить (зависит от действий пользователя).

Soyfer
() автор топика
Ответ на: комментарий от Soyfer

То есть сервер и клиент шлют друг другу совершенно независимо? Два потока здесь подойдут. Один поток всегда слушает, другой отсылает когда это понадобится клиенту. Можно сделать на неблокирующем сокете. Если ничего не пришло, то он не ждет, а сразу предает управление программе и при посылке он тоже сразу возвращает управление. В этом случае потоки не нужны.

Booster ★★
()
Последнее исправление: Booster (всего исправлений: 2)
Ответ на: комментарий от Booster

А при условии что на неблокирующий что то пришло, а я не приняв отправляю, это будет ошибкой? И как неблокирующие сокеты подружить с OpenSSL?

Soyfer
() автор топика
Ответ на: комментарий от Booster

Я нашел только информацию где их именно «дружат», наподобие этого c++ & openssl

Документация весьма неудобная, просто описания функций.

Soyfer
() автор топика
Ответ на: комментарий от Soyfer

асинхронность потому что.

Причем здесь асинхронность?

Есть вариант в одном потоке все сделать?

Да, тебе выше анонимус уже сказал правильный вариант - используй неблокирующий ввод-вывод. Если очень хочется, можешь работу в одном потоке делать, а ввод-вывод в другом. Но читать в одном, а писать в другом - тупость несусветная.

Vovka-Korovka ★★★★★
()
Последнее исправление: Vovka-Korovka (всего исправлений: 1)
Ответ на: комментарий от Vovka-Korovka

Я не смог подружить OpenSSL с неблокирующими сокетами, а как пихать данные для расшифровки и куда - не знаю, в этом и проблема.

Soyfer
() автор топика
Ответ на: комментарий от Soyfer

Я не смог подружить OpenSSL с неблокирующими сокетами, а как пихать данные для расшифровки и куда - не знаю, в этом и проблема.

А чего их там дружить. Создаешь неблокирующий сокет, и устанавливаешь его через функцию SSL_set_fd. Зачем инициируешь операцию (например, SSL_connect()) - дальше смотришь на ошибку. Если ошибка вида SSL_ERROR_WANT_READ или SSL_ERROR_WANT_WRITE, то висишь в select/poll/epoll и дожидаешсья пока сокет не станет готовым для чтения/записи. После этого повторяешь нужную функцию SSL (например, SSL_connect()). Я так делал, точно работает.

Vovka-Korovka ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.