LINUX.ORG.RU

Библиотека с сокетами

 , ,


0

4

Привет,

а какие есть в C++ хорошие высокоуровневые библиотеки для работы с неблокирующими сокетами, кроме asio?

Хочется иметь интерфейс как минимум, как у Qt: получать асинхронное уведомление о том, что из сокета можно прочитать, иметь возможность всегда мгновенно дописать произвольное количество в буфер записи, получить асинхронное уведомление о том, что запись завершилась, диагностировать отваливание второй стороны сокета.

Смотрел Poco и в нём Socket+React, но как-то совсем не дотягивает (в т.ч. потому что прибито гвоздями к select, и управлять буфером всё равно надо самому). Велосипедить на ev++ не хочется. На awesome-cpp в основном всякие http-серверы упоминаются.

★★★

Хочется иметь интерфейс как минимум, как у Qt

Ответ будет немного очевиден :)

Stil ★★★★★
()

Двачую вопрос про «чем asio не угодил?».

Pavval ★★★★★
()

libevent, libev/libeio, libuv, ioxx
А, ну и glib вроде еще умеет с сокетами в асинхронном completion-oriented стиле работать.

kravich ★★★★
()
Последнее исправление: kravich (всего исправлений: 2)

Велосипедить на ev++ не хочется.

Это ты про libev? Можно и сишный интерфейс использовать. Мне он даже проще показался.

Тут вопрос такой. Тебе нужен пул потоков?

Если да, то альтернатив asio возможно и нет, по крайней мере, мне неизвестны (*). Если же ты намерен обрабатывать (множественные) запросы из одного потока, а такое тоже имеет право на жизнь, хотя уровнем по-ниже будет по производительности, отказоустойчивости и т.п., то тогда libev и компания, как перечислили выше.

(*) в Poco особо не вникал - не хотел тянуть такую зависимость в проект

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

Можно, конечно, из разных предопределенных потоков обрабатывать запросы, в каждом потоке свои запросы, но тогда почему самому не написать простенькую прослойку над select/poll? Тогда не нужны ни asio, ни libev и компания.

dave ★★★★★
()

Если очень привередливый, то лучше написать самому именно такой фреймворк, какой нравится. Я, например, так и поступил.

pathfinder ★★★★
()

получить асинхронное уведомление о том, что запись завершилась, диагностировать отваливание второй стороны сокета.

факт записи в сокет не очень интересна, а о том что сообщение «там» пришло никак не узнать (я незнаю как), если обратно сам пакет не пришлешь

отваливание также не узнать быстро, что опять требует свой протокол «запрос»-«ответ»

а чем qt не устроила ?

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

Ответ будет немного очевиден :)

Да, я тоже думал об этом :) Но сигналы/слоты/moc и QString/QByteArray тянуть во все остальные места программы очень не хочется.

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

может, boost?
А чем asio-то не устроил?
Двачую вопрос про «чем asio не угодил?».

В основном нечитаемым синтаксисом. Плюс любопытно изучить другие библиотеки.

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

libevent, libev/libeio, libuv, ioxx

Первые три не управляют сокетами, а только событиями. ioxx не видел, сейчас посмотрю.

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

Тут вопрос такой. Тебе нужен пул потоков?

В непосредственном виде нет. На всё чтение мне точно хватит одного потока, запись иногда будет делаться из другого потока.

vzzo ★★★
() автор топика
Ответ на: комментарий от no-such-file

libpoco

А есть где-нибудь адекватная документация или примеры, как выглядят асинхронные сокеты на libpoco? Нужно ли самому управлять буферами?

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

факт записи в сокет не очень интересна,

Факт записи в сокет для меня будет некоторым подтверждением того, что данные не оседают в буферах библиотеки / ОС, а куда-то пытаются уйти. Так как данные инвалидируются в течение нескольких секунд, копить их очередь нет смысла.

отваливание также не узнать быстро, что опять требует свой протокол «запрос»-«ответ»

Быстро и не нужно, главное — узнать.

а чем qt не устроила ?

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

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

В основном нечитаемым синтаксисом.

Это в каком месте?

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

А есть где-нибудь адекватная документация или примеры, как выглядят асинхронные сокеты на libpoco?

А на сайте poco посмотреть никак нельзя? Там даже слайды есть, для школьников - http://pocoproject.org/slides/200-Network.pdf

no-such-file ★★★★★
()

Есть у меня самописная библиотека на базе epoll (можно на kqueue переделать заменой одного файла), с реализацией HTTP, WebSocket и какой-то другой фигни. Там даже HTML шаблонизатор есть, то есть легко запиливается сайтик с парсингом форм и т.п. Там есть известные мне глюки и костыли (фиксы в «секретной» ветке), но попробовать можно. При написании делался акцент на минимальное копирование данных, хотя в вебсокетной реализации до сих пор живёт не выпиленный дурацкий буфер с лишним копированием. При парсинге HTTP, например, передаю между подпрограммами пару {char*, size_t}, указывающую на строку во входящем буфере и т.п.

https://github.com/pavelkolodin/fir

Пример HTTP сервака на этой либе:

https://github.com/pavelkolodin/examples

На этой либе работают:

http://fintank.ru/

http://obsuditor.ru/chat/

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

Лицензия пока вида https://ru.wikipedia.org/wiki/WTFPL

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