LINUX.ORG.RU

C++ xmpp

 , ,


1

2

Хочу написать бота на С++. Требуется что бы написанного бота можно было просто скинуть на сервер и запустить.
Вычитал, что все используют gloox. Меня смущает что gloox нужно устанавливать. Можно ли будет потом собрать все необходимые файлы и запустить бота на сервере без установки чего либо дополнительного? Или что лучше подойдет для моих целей?
Раньше на C++ ничего не делал кроме хелловорлдов. Собственно написать бота и решил, чтобы попрактиковаться.
Пните в нужном направление.

★★★★★

Последнее исправление: TDrive (всего исправлений: 1)

Меня смущает что gloox нужно устанавливать.

А что в этом плохого?

Tanger ★★★★★
()

Либо устанавливать библиотеки gloox'a на сервер, либо вконпелять его статически в бинарник. Так же можно поступать с любыми недефолтными библиотеками, если нету возможности их установить.
И еще посмотри в сторону питона и xmppy, например.

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

Либо устанавливать библиотеки gloox'a на сервер, либо вконпелять его статически в бинарник.

О вот можно об этом поподробнее? Это указывается флагами для g++? Где прочитать об этом?

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

Почитать можно в man gcc/g++/ld. Ключик --static собирает статически все что может.
Чтобы впихнуть одну-единственную библиотеку, достаточно указать ее статическую версию, gcc bin.out libexample.a

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

Спасибо, думаю дальше разберусь.

TDrive ★★★★★
() автор топика

то есть протокол XMPP с нуля самому? НУ дружок готовься к тому что ты около года будешь вылизывать либу реализующую XMPP и только потом сможешь приступить к реализации непосредственно бота.

anonymous
()
Ответ на: комментарий от TDrive
$ ldd ./libjreen.so.1.1.0 
	linux-vdso.so.1 =>  (0x00007fff2a4be000)
	libQtNetwork.so.4 => /usr/lib/x86_64-linux-gnu/libQtNetwork.so.4 (0x00007f52a66df000)
	libQtCore.so.4 => /usr/lib/x86_64-linux-gnu/libQtCore.so.4 (0x00007f52a6211000)
	libqca.so.2 => /usr/lib/x86_64-linux-gnu/libqca.so.2 (0x00007f52a5f17000)
	libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f52a5d00000)
	libspeex.so.1 => /usr/lib/x86_64-linux-gnu/libspeex.so.1 (0x00007f52a5ae7000)
	libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f52a57e2000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f52a55cc000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f52a520f000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f52a4ff1000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f52a4ded000)
	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f52a4be5000)
	libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f52a48ef000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f52a45f5000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f52a6d9a000)
	libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f52a43b7000)

и QtNetwork еще, иксов нет

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

Может то, что ТС таки новичек для таких действий? А со jreen'ом всегда можно с вопросами ко мне обратиться или в конфу кутима.

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

Не тянет, и пара кутимовских ботов на jreen'е и написана!

Gorthauer ★★★★★
()

Угу. Было дело...

Требуется что бы написанного бота можно было просто скинуть на сервер и запустить.

В своё время делал подобное в целях удалённого управления и лёгкого скрытного администрирования. Правда, на С.

Пните в нужном направление.

Кхм... Направлений тут несколько. Во-первых, для нормальной работы бота нужно внимательно ознакомиться с http://wiki.xmpp.org/web/Programming_Jabber_Clients

Важно обратить внимание на то, что сам по себе поток сообщений от бота и к боту это XML. Организация приведена в ссылке выше. Дело в том, что либо Вам придётся парсить и создавать сообщения либо самому («врукопашную»), либо используя libxml2/expat... Это первая зависимость. В случае, если будете сами напрямую работать с XML, то её можно избежать, но для начала не рекомендую морочиться.

Во-вторых, бота можно реализовать по открытому протоколу (порт 5222, согласно RFC 3920). Но это действительно не интересно. Лучше использовать SASL/TLS для того, чтобы закрыть протокол и не смущать админов. Дело в том, что все предполагают что новые клиенты xmpp работают по закрытому протоколу, на «неофициальном» порту 5223 (на порту 5222 любой дятел со сниффером наперевес, находящийся в том же домене коллизий что и Ваш бот, спалит и его наличие и поток команд-откликов). Так что, вторая зависимость, это поддержка протокола TLS/SASL.

Или что лучше подойдет для моих целей?

Если на «попробовать», то я бы рекомендовал начать с уже проделанной работы. Т.е., для начала, берите библиотеку (ту же loudmouth или iksemel — вот это вообще на голом С и ни кого это не обламывает) и пробуйте просто зарегистрироваться на сервере. Ну и дальше по Вашему списку (что Вы хотите получить от бота). Список доступных и работоспособных библиотек здесь. Разберитесь с сущностями — например каким образом xmpp-клиент на одной учётной записи, на одном сервере, может иметь произвольное число подключений с разных машин. Прочтите RFC 3920, вики по ссылке выше.

Если захочется для «боевого применения», то потом просто проанализируйте код используемой библиотеки и перепишите для своей задачи. Ну и, само собой, Вам придётся линковать зависимости статически. Собственно, это уже сказали.

P.S. Чуть не забыл — забейте на советчиков, рекомендующих сменить язык. В ответ смело рекомендуйте поменять ориентацию.

Собственно написать бота и решил, чтобы попрактиковаться.

Всё верно. Заодно и с сетевым программированием разберётесь. Будут вопросы — задавайте, помогу чем смогу.

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

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

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

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

А подробнее можно? Что такого есть в перле/питоне/руби чего нельзя сделать или неоправданно долго делать на С++?

TDrive ★★★★★
() автор топика
Ответ на: Угу. Было дело... от mr_noone

RFC 3920 я уже сам нашёл, а про библиотеки и шифрование не знал. Спасибо за информацию.

TDrive ★★★★★
() автор топика
Ответ на: комментарий от wota
# emerge jreen -pv

 * IMPORTANT: config file '/etc/portage/savedconfig/sys-apps/busybox-1.19.3-r1' needs updating.
 * See the CONFIGURATION FILES section of the emerge
 * man page to learn how to update config files.

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild  N     ] app-text/poppler-data-0.4.5-r1  4,030 kB
[ebuild  N     ] media-libs/libpng-1.5.10  USE="-apng (-neon) -static-libs" 687 kB
[ebuild  N     ] app-text/libpaper-1.1.24-r1  347 kB
[ebuild  N     ] media-libs/tiff-4.0.1-r1  USE="cxx zlib -jbig -jpeg -lzma -static-libs" 1,945 kB
[ebuild  N     ] net-dns/libidn-1.24  USE="nls -doc -emacs -java -mono -static-libs" 3,248 kB
[ebuild  N     ] app-admin/eselect-qtgraphicssystem-1.1.1  2 kB
[ebuild  N     ] media-libs/jbig2dec-0.11-r1  USE="-png -static-libs -test" 363 kB
[ebuild  N     ] media-libs/lcms-2.3  USE="zlib -doc -jpeg -static-libs -test -tiff" 4,358 kB
[ebuild  N     ] app-arch/rpm2targz-9.0.0.4g  5 kB
[ebuild  N     ] media-libs/lcms-1.19  USE="zlib -jpeg -python -static-libs -tiff" 907 kB
[ebuild  N     ] dev-libs/libgpg-error-1.10  USE="nls -common-lisp -static-libs" 429 kB
[ebuild  N     ] dev-lang/nasm-2.10  USE="-doc" 796 kB
[ebuild  N     ] x11-proto/xextproto-7.2.0  USE="-doc" 203 kB
[ebuild  N     ] x11-libs/qt-core-4.8.1-r3  USE="exceptions glib iconv ssl (-aqua) (-c++0x) -debug -icu -optimized-qmake -pch (-qpa) -qt3support" 233,991 kB
[ebuild  N     ] x11-proto/inputproto-2.0.2  152 kB
[ebuild  N     ] x11-libs/libICE-1.0.7  USE="ipv6 -doc -static-libs" 317 kB
[ebuild  N     ] x11-proto/videoproto-2.3.1  99 kB
[ebuild  N     ] x11-proto/renderproto-0.11.1  104 kB
[ebuild  N     ] media-fonts/font-util-1.2.0  132 kB
[ebuild  N     ] x11-misc/util-macros-1.17  76 kB
[ebuild  NS    ] dev-lang/python-2.7.3-r1 [3.2.3] USE="gdbm ipv6 ncurses readline ssl threads (wide-unicode) xml -berkdb -build -doc -examples -sqlite -tk -wininst" 11,532 kB
[ebuild  N     ] app-text/poppler-0.18.4-r1  USE="cxx introspection lcms utils xpdf-headers -cairo -cjk -curl -debug -doc -jpeg -jpeg2k -png -qt4 -tiff" 1,947 kB
[ebuild  N     ] media-fonts/urw-fonts-2.4.9  USE="-X" 3,124 kB
[ebuild  N     ] x11-proto/randrproto-1.3.2  121 kB
[ebuild  N     ] x11-proto/kbproto-1.0.5  109 kB
[ebuild  N     ] x11-proto/xf86bigfontproto-1.2.0  49 kB
[ebuild  N     ] x11-libs/libXau-1.0.6  USE="-static-libs" 256 kB
[ebuild  N     ] x11-libs/libXdmcp-1.1.0  USE="-doc -static-libs" 282 kB
[ebuild  N     ] dev-libs/libpthread-stubs-0.3  USE="-static-libs" 199 kB
[ebuild  N     ] dev-libs/libgcrypt-1.4.6  USE="-static-libs" 1,125 kB
[ebuild  N     ] media-libs/libjpeg-turbo-1.2.0-r1  USE="-java -static-libs" 1,726 kB
[ebuild  N     ] virtual/jpeg-0  USE="-static-libs" 0 kB
[ebuild  N     ] app-crypt/qca-2.0.3  USE="(-aqua) -debug -doc -examples" 4,425 kB
[ebuild  N     ] x11-libs/libSM-1.2.0  USE="ipv6 uuid -doc -static-libs" 278 kB
[ebuild  N     ] x11-libs/qt-script-4.8.1  USE="exceptions iconv jit (-aqua) (-c++0x) -debug -pch (-qpa)" 0 kB
[ebuild  N     ] x11-proto/fixesproto-5.0  99 kB
[ebuild  N     ] dev-libs/libxslt-1.1.26-r3  USE="crypt -debug -python -static-libs" 3,322 kB
[ebuild  N     ] x11-proto/xcb-proto-1.6-r2  91 kB
[ebuild  N     ] x11-libs/libxcb-1.7  USE="-doc (-selinux) -static-libs" 312 kB
[ebuild  N     ] x11-libs/libX11-1.4.4  USE="ipv6 -doc -static-libs -test" 2,269 kB
[ebuild  N     ] x11-libs/libXext-1.3.0  USE="-doc -static-libs" 334 kB
[ebuild  N     ] x11-libs/libXrender-0.9.6  USE="-static-libs" 253 kB
[ebuild  N     ] x11-libs/libXfixes-5.0  USE="-static-libs" 248 kB
[ebuild  N     ] x11-libs/libXv-1.0.6  USE="-static-libs" 266 kB
[ebuild  N     ] x11-libs/libXrandr-1.3.2  USE="-static-libs" 268 kB
[ebuild  N     ] x11-libs/libXcursor-1.1.12  USE="-static-libs" 291 kB
[ebuild  N     ] x11-libs/libXi-1.4.3-r1  USE="-doc -static-libs" 413 kB
[ebuild  N     ] net-print/cups-1.5.2-r4  USE="acl filters jpeg pam png ssl threads tiff -X -avahi -dbus -debug -gnutls -java -kerberos -ldap -perl -python -slp -static-libs -usb -xinetd" LINGUAS="ru -da -de -es -eu -fi -fr -id -it -ja -ko -nl -no -pl -pt -pt_BR -sv -zh -zh_TW" 9,407 kB
[ebuild  N     ] app-text/ghostscript-gpl-9.05-r1  USE="cups -X -bindist -dbus -djvu -gtk -idn -jpeg2k -static-libs" LINGUAS="-ja -ko -zh_CN -zh_TW" 27,622 kB
[ebuild  N     ] net-print/foomatic-filters-4.0.15  USE="cups -dbus" 260 kB
[ebuild  N     ] x11-libs/qt-gui-4.8.1-r1  USE="accessibility cups exceptions glib xv (-aqua) (-c++0x) -dbus -debug -egl -gif -gtkstyle -mng -nas -nis -pch (-qpa) -qt3support -tiff -trace -xinerama" 0 kB
[ebuild  N    ~] net-libs/jreen-1.1.0  USE="-debug" 218 kB

Total: 52 packages (51 new, 1 in new slot), Size of downloads: 323,015 kB

The following keyword changes are necessary to proceed:
#required by jreen (argument)
=net-libs/jreen-1.1.0 ~amd64

 * IMPORTANT: 2 news items need reading for repository 'gentoo'.
 * Use eselect news to read news items.

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

Язык низкоуровневый, более многословный и менее безопасный, чем питон/руби/перл. Его применяют, когда нужна скорость кода за счёт скорости разработки, т.е. я уже перечислил где. XMPP бот большую часть времени находится в режиме ожидания, ему высокая производительность в принципе не нужна.

Есть в крестах и высокоуровневые библиотеки: stl, loki и boost, например. Но применять их без хорошего понимания, как работают шаблоны невозможно. (Хотя stl довольно таки user-friendly, тонкостей там хватает. В boost вообще чёрт ногу сломит).

В общем, делать неоправданно долго (либо исхитряясь так, что 70% кодеров тебя не поймёт) и аккуратно на C++ нужно практически всё.

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

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

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

Ну и изучать C++, используя сторонние библиотеки, сразу после «hello world»... Представляю, какой феерический доброкод получится. Лучше матрицы сначала поперемножай, в самом деле.

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

Так я на перле с сетью работал, пакетными сокетами, форками, пайпами, сигналами от ОС... На java тоже опыт программирования имеется. Сколько можно эти матрицы умножать на каждом ЯП который начинаешь учить.)

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

В C/С++ крайне муторная и опасная работа с памятью. И для начала хорошо бы представить размер проблемы: сначала просто наступить на грабли, а потом уже лезть в тёмный сарай с сельхозпринадлежностями. Вот я и рекомендую повозиться с матрицами: сделать их через указатели, затем через stl.

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

Понятно. Да думаю в этом есть смысл. Спасибо за совет.

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

Попка (твоя?) повторяет всякую чушь?

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

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

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

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

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

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

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

Медленные по сравнению с чем? С обычными указателями? Но ведь обычные не нужны, если верить тебе.

Или по сравнению с альтернативой в «годных» языках?

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

С обычными указателями?

Да.

Но ведь обычные не нужны

Я говорил, что обычные - та ещё гадость, но нужны.

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

Я говорил, что обычные - та ещё гадость, но нужны.

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

Если оно медленное по сравнению с другим (менее удобным) вариантом из крестов, но не медленнее, чем «удачный» выбор другого языка, то нельзя называть это решение медленным и не считать за аргументацию в пользу крестов.

Итак, ты что ты там утверждаешь?

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

Ещё как нужно.

Только для использования с древнелибами на С. Но и это спокойно оборачивается.

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

Тебе оно не понравилось, ибо медленное.

Да не серебряная пуля это, а костыль. Дело не только в медленности, но и в количестве букв, например, которое нужно писать: Foo* и boost::shared_ptr<Foo>. А разыменование weak_ptr - это вообще комедия двух действиях. Велика вероятность, что в команде найдётся сишник, считающий себя самым умным, наляпает голых указателей и устроит сегфолт.

Я предложил тебе решение, которое сильно упрощает проблему,

Которое помогает заглотить кактус чуть поглубже.

Итак, ты что ты там утверждаешь?

Что плюсы - узкоспециальный язык.

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

Указателей я стараюсь избегать, но когда очень нужно - см. ответы выше. Ничего «крайне муторного и опасного» нет, разве что работать приходится с легасиговнокодом (мне приходится), да и то, слухи преувеличены.
Пусть меня закидают камнями, но для большинства вещей достаточно auto_ptr.

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

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

JackyTreehorn
()

Требуется что бы написанного бота можно было просто скинуть на сервер и запустить

Забудь про плюсы, задача и язык несовместимы, для задачи нужен питон и ко.

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

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

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

Если ТС просит помощи по плюсам, какого хрена лезть с другими языками?

P.S. Чуть не забыл — забейте на советчиков, рекомендующих сменить язык. В ответ смело рекомендуйте поменять ориентацию.

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

можно использовать для чего угодно

Да, можно. Можно и парсеры из перегруженных операторов делать, и ленивые вычисления. Но есть гораздо более эффективные средства. с++ нужен там, где нужна скорость работы, либо низкоуровневость. Больше оправданных применений ему я не вижу.

Указателей я стараюсь избегать

ОП по собственному признанию писал только «hello world». Предлагаешь ему сразу начать со смартпоинтеров? Как вообще понять работу обёрток над указателями, не понимая, что есть голый указатель?

Так что моя фраза про сложность работы с памятью оправдана. Нужно либо работать с ней руками, что сложно, либо использовать сложные обёртки.

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