Как стать автором
Обновить

Комментарии 27

Здравствуйте.

Было бы здорово, если расскажите как распарсить post форму с файлами.

Магия select не раскрыта. Как сформировать архитектуру, чтобы никто не ждал?

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

Тогда вероятно evet loop будет по ресурсам выгоднее)

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

А тут просто сокет открыли, причем два клиента одновременно оно не потянет.

вам еще трид на каждого клиента нужен будет +-(тут на начальном подходе будет работать как делают професионалы не знаю)

thread /θred/, то есть уж лучше «тред», а не «трид»

Данная статья - это какая-то антиреклама ваших "уроков по си". Вы ж ради ссылочки на курсы ее запостили, но в коде который я увидел очень сложно найти хоть одну верную строку кроме "Hello, Habr!"

  • Не скомпилируется на винде

  • Не скомпилируется без зависимостей

  • Работает с одним клиентом

  • Не обрабатывает часто-возникающие ошибки

  • Блокирующий

  • Не используете select или прерывания (на них я уж не надеюсь)

  • Запись ответа тоже может вызывать обрабатываемые ошибки и необрабатываемые, после которых надо закрывать соединение

  • Даже ответ не соответствует HTTP! Версия 1.1 подразумевает заголовок Connection, но его нет, хотя браузеры и клиенты уже научились игнорить такие мелочи благодаря таким вот разработчикам (UPD. прошу прощения, в конце таки написано что 1.1 только ради красоты и он на самом деле не поддерживается)

  • Буфер всего на килобайт, когда сейчас если послать запрос из браузера там запросто может быть значительно больше, а вы закрываете сокет после чтения 1024 байт, которые может еще и не все пришли

  • И это еще не все..

Блин, тут вроде не так много кода, но настолько сильно накосячить - это талант.

Статья интересная, спасибо большое за информацию, поставил класс и подписался, буду рекомендовать родственникам и одноклассникам

У меня на винде компилировался и работает "Cygwin GCC". Как база для дальнейшей разработки весьма не плохо. У новичков не должно возникнуть проблем.

у меня в WSL тоже, но я в целом говорил о том, что в статье не указана платформа. не указано какие зависимости нужны, какой компилятор использовался. У меня вот компилятор Visual Studio и там этот код не скомпилируется.

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

можно немного переписать используя winsock.h и все должно будет в VS работать.

Не немного, там и коды ошибок разные, и много чего другого. Хотя тут они не обрабатываются все равно ;D

в целом потребуется куча ifdef ifndef и код будет выглядеть как спагетти.

конечно, можно и select добавить и много чего еще, тогда да, получится какой-то сервер. Но даже так его сложно назвать HTTP, так как пока что это TCP-сервер. А для HTTP надо еще много стандартов и механизмов поддержать - не только хардкодную структуру заголовки + тело

используя winsock.h

Кстати, я правильно понял что winsock 1.x сейчас совсем выпилили и можно действительно использовать этот заголовок (а не winsock2.h)?

Код типа изложенного в статье писал по приколу лет двадцать с лишним назад, когда работал над кодеками. После того, как заработало кодирование mp3 - сляпал вечером серверок, который раздаёт то, что играется в локальном CD приводе, по сетке, чтобы можно было винампом приконнектиться. Но даже там несколько клиентов поддерживалось.

  • Не используете select или прерывания (на них я уж не надеюсь)

Прерывания ? Что имеется ввиду ?

https://linux-kernel-labs.github.io/refs/heads/master/lectures/interrupts.html
https://man7.org/linux/man-pages/man7/epoll.7.html
https://habr.com/ru/articles/416669/

Сетевая карта может прервать выполнение программы на процессоре тем самым вызывав обработку события в программе которая прослушивает сокеты. Этот метод эффективнее чем проверка через select или в лоб проверка через recv когда соединений очень много. Не нужно проходить в цикле по всему массиву клиентов.

Всё равно прерывание через ядро пойдёт, быстрее сразу обработать в user mode )

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

Понятно, но при рассказе про азы, как в этой статье, главное вовремя остановиться.

Эта статья вообще эталонный пример как стриггерить кучу народа на коменты, или даже можно сказать - прервать их работу и заставить их писать коменты сюда:
- Открытая концовка
- Вопрос в никуда (что еще добавить, и так же все хорошо?)
- Множество ошибок
- Популярная тема, которая заденет большой срез населения

Еще и автор теперь хранит гордое молчание, а мы сами с собой тут обсуждаем его проблемы

Как то вы слишком вольготно, переходите от прерывания сетевой карты к возврату из pselect()/poll()/epoll() (которые происходят через file_operations->poll()).

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

Этот метод эффективнее чем проверка через select или в лоб проверка через recv когда соединений очень много. Не нужно проходить в цикле по всему массиву клиентов.

Программа в user space НИЧЕГО не знает о самих прерываниях в ядре. К тому же при единственном соединении (читай файловом дискрипторе) блокирующий read() по эффективности ничем не отличается от pselect()/poll()/epoll().

Программа в user space НИЧЕГО не знает о самих прерываниях в ядре. К тому же при единственном соединении (читай файловом дискрипторе) блокирующий read() по эффективности ничем не отличается от pselect()/poll()/epoll().

А возможно read() и эффективнее будет в данном случае, меньше сисколов, меньше ядерной машинерии.

финальный код

Последовательная обработка клиентских запросов ошибочна тем что один клиент через какой нибудь телнет можно остановить весь ваш процесс...

Ну в книжках по c это называют программирование сокетов. Http поскольку поскольку.

А на epoll слабо?

Из статьи непонятно ровным счётом ничего. Хочется порекомендовать начинать с вопросов:
- для кого пишется статья?
- какими знаниями обладают читатели?

Если статья рассчитана на начинающих, то можно не полениться и описать немного теории, а не просто какие-то куски кода с комментариями – это итак есть на Github без ссылок на курсы.

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

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий