Pull to refresh

Comments 33

А для C правда нет ни одной библиотеки для работы с HTTP?

Скорее всего есть, но в работе с HTTP ничего трудного не вижу, поэтому смысла использовать библиотеки не вижу

Ну да, совсем ничего трудного: стриминга/чанкинга не существует, енкодинга не существует… Вот пришлют вам запрос c Content-Length: find for yourself — и развлекайтесь себе. А еще в ответ на некорректный контент-тайп надо отвечать 400 или 415. Ну и так далее.

Так я и не писал полноценный http сервер, а только для работы с сервером telegram, у которого строгая спецификация. Я не спорю, даже тут некоторых моментов не хватает.

Так я и не писал полноценный http сервер, а только для работы с сервером telegram, у которого строгая спецификация.

Вот только вы не знаете, что к вам обращается именно сервер telegram. И того, что он всегда будет поддерживать спецификацию — тоже. И того, что между вами нет прокси. И еще пятнадцати вещей.


Поэтому всегда соблюдайте спецификацию. По крайней мере в части корректной обработки того, что к вам присылают.

Я не понимаю чего Вы добиваетесь?
Тут все левые запросы отпадают уже при проверке запроса POST и ссылки которая поедставляет из себя токен, дальше просто проверяется Content-Length и считываются уже сами данные. Да, согласен, прокси может сжать данные в gzip, да тогда прога, вероятнее всего, упадет, правда упадет только дочерний процесс, а с нормальными запросами сервак продолжит работать

Я не понимаю чего Вы добиваетесь?

Отсутствия велосипедов.


Тут все левые запросы отпадают уже при проверке запроса POST и ссылки которая поедставляет из себя токен,

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


упадет только дочерний процесс

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


И это мы еще не стали обсуждать ручной парсинг JSON с помощью strstr.

Так, во-первых прочитайте дисклеймер в начале статьи. А во-вторых серваки apache, nginx и подобные работают по тому же принципу, для каждого соединения отдельный процесс, с одним лишь отличием, процессы там создается заранее, а потом передаются туда данные, так как создание процесса занимает относительно длительное время. Если Вы хотите показать на мою неграмотность в программировании, то не должны судить по одной статье. Текст и так получился достаточно длинным, а если я бы учитывал все тонкости, статья бы получилась слишком громоздкой. Я согласен со всеми Вашими замечаниями, но для Hello, World бота Вы предъявляете слишком высокие тоебования, поэтому прошу закончить эту демагогию.

Так, во-первых прочитайте дисклеймер в начале статьи.

Это повод игнорировать замечания?


А во-вторых серваки apache, nginx и подобные работают по тому же принципу, для каждого соединения отдельный процесс, с одним лишь отличием, процессы там создается заранее, а потом передаются туда данные, так как создание процесса занимает относительно длительное время.

Имеенно. А есть сервера, которые не создают процесс на каждое соединение (именно потому, что это дорого).


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

Я ничего не хочу сказать о вашей неграмотности, я говорю о неграмотности решения в статье.


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

… а если бы вы взяли готовое решение, то тонкости бы учитывало оно, а не вы. О чем и речь.

Серьезно? Отпадают?
Расскажите, а что будет с вашим
char header[1024];

если нигде в запросе не встретится \r\n\r\n и запрос будет больше 1024 байт?

Покажите, пожалуйста, где это написано, и почему нельзя просто оборвать соединение?

В RFC на HTTP/1.1. Если вы так не делаете, ваш сервер не поддерживает этот протокол в полной мере.


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

Сервер должен, конечно. А как, по-вашему, клиент должен ответить? Клиент же только запросы может посылать.

Так я про сервер говорю, а не про клиент.

А, да.


char header[] = "POST /bot352115436:AAEAIEPeKdR2-SS7p9jGeksQljkNa9_Smo0/sendMessage HTTP/1.1\r\nHost: files.ctrl.uz\r\nContent-Type: application/json\r\nContent-Length: %d\r\nConnection: close\r\n\r\n%s";

Круто же. Любой уважающий себя сервер (кроме files.ctrl.uz) мог бы и послать.

Токен не настоящий, к Вашему сведению

Да токен-то ни при чем, в общем-то. Это просто иллюстрация к "HTTP — это просто".

Когда я вижу решение задачи на C — ожидаю, что
1. Нужна очень высокая скорость работы, недостижимая на скриптовых и VM-языках
В случае с телеграм-ботом не требуется — мы скорее упрёмся в ограничение самого телеграма (примерно не более 30 сообщений/с.)
2. Работаем на оборудовании с очень ограниченными ресурсами.
Хм, сейчас даже роутер на openwrt спокойно тянет простенькие PHP/Python-скрипты. дешевле написать на них телеграм бота, логику которого гораздо легче поддерживать.

3. Совершенно не упомянуто очень важное свойство телеграма — можно не просто ответить 200 OK — а сразу передать ответ!
а если есть программа на С++, у которой основная задача допустим некие быстрые вычисления (обработка котировок например), а побочная — управлять роботом для телеги, тогда как делать? Лепить связку этой программы с подпрограммой на питоне?
Познавательная статья, спасибо. Думаю, в скором времени она мне пригодиться на практике.
В код не вдавался, скорее в порядок действий, но успел заметить использование функции bzero.
Из мана:
4.3BSD. This function is deprecated (marked as LEGACY in
POSIX.1-2001): use memset(3) in new programs.

Мемсет — наше спасение :)
Ну и код. Он больше запутывает, чем дает какую-то пользу.
Хороший пример того, как не надо писать программы…
В самом начале статьи автор предупредил, что не является профессиональным си-программистом.
Поэтому, кмк, профит данной в статьи именно в алгоритме действий.
У тех, кто в первый раз с этим столкнулся перед глазами будет рабочий пример:)

Эмм, алгоритме каких действий?

Например, я вообще не писал ботов.
Теперь мне стало ясно, как работать с апи, предоставляемым телеграммом.
Я был приятно удивлен тем, что можно оформить это в виде простого сетевого приложения (у меня уже целая библитека функций для приложений на сокетах).
Теперь мне стало ясно, как работать с апи, предоставляемым телеграммом.

… и как же, если не секрет?


Я был приятно удивлен тем, что можно оформить это в виде простого сетевого приложения

Ну да, http-сервер — это "простое сетевое приложение", что в этом удивительного?

… и как же, если не секрет?
Про сертификат до этой статьи я был ни сном, ни духом :)

Ну да, http-сервер — это «простое сетевое приложение», что в этом удивительного?
Последние пару месяцев я моими тасками было ковыряться в сорцах udhcpc и udhcpd, расширяя его функционал.
После всего этого то, что представлено тут, воспринимается очень просто :)
Про сертификат до этой статьи я был ни сном, ни духом

Это не отвечает на вопрос "как работать с апи, предоставляемым телеграмом".


После всего этого то, что представлено тут, воспринимается очень просто

… просто — не значит правильно.

Теперь мне стало ясно, как работать с апи, предоставляемым телеграммом.

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

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

Если этот вариант не проканает, то можно воспользоваться RAW-сокетами — тогда можно будет распарсить сырой пакет полностью и посмотреть заголовки.
После этого — сравнить сертефикаты.
В один из ее экземпляров можно записывать адрес клиента, который пытается подключиться.

И что делать с этим адресом?


Если этот вариант не проканает, то можно воспользоваться RAW-сокетами — тогда можно будет распарсить сырой пакет полностью и посмотреть заголовки. После этого — сравнить сертефикаты.

Сравнить какой сертификат с чем?

Когда имеем дело с вводом пользователя или 3их лиц таких как сервер то надо обязательно проверять корректность ввода.
Кроме переполнения header из комента выше могу добавит проблему что не везде есть проверки что strstr находит подстроку. И дальше может быть обращение к плохому указателю.
На будущее, кто зайдёт в эту статью, есть отличная либа github.com/smartnode/telebot. Я разобрался за 20 минут, и через час уже был готовый бот на сях.
Only those users with full accounts are able to leave comments. Log in, please.