Skip to content

artiomn/network-programming-book-code

Repository files navigation

Repository with a code for the "Network Programming" book

Build C++ code for Linux Build C++ code for Windows Build and push Docker images

Код для книги "Сетевое программирование".

Оглавление

Начало работы

Чтобы начать работать:

  • Если Docker не установлен в системе, установите его.
  • Если Git не установлен в системе, установите его.
  • Склонируйте репозиторий: git clone https://github.com/artiomn/network-programming-book-code.git. Внимание: склонируйте репозиторий в каталог, содержащий только латинские символы в пути!
  • Зайдите в каталог network-programming-book-code.
  • Запустите скрипт ./build_dockerized.sh

Если это первый запуск, пройдёт значительное время перед тем, как вы получите результат.

Для запуска IDE QtCreator выполните из каталога network-programming-book-code следующую команду: ./run -q. Будет запущена IDE, в которой необходимо открыть, как проект, файл CMakeLists.txt в каталоге /home/developer/src или /usr/src/gb/src (первый каталог - ссылка).

FAQ

У вас же тут всё идеально, точно без ошибок?

Наоборот. Почти наверняка здесь есть ошибки. Книга - большой проект. Их появление неизбежно. Поэтому, если вы заметили ошибку, смело заводите Issue. Аналогично вы можете заводить issue с ошибками в тексте книги, и если потребуется, будет выпущен соответствующий erratum. Предложения также приветствуются.

К оглавлению ⮐

Почему меня забанили?

Есть некоторые очевидные для большинства людей вещи, которые не к месту в репозитории кода для книги. Например, политика. Хотите донести своё мнение? Сделайте это в чате Telegram канала. Там мы забаним вас гораздо быстрее.

Помимо очевидного, есть то, что не все начинающие разработчики понимают. Например:

  • Попытка реквестов с решениями заданий в этот репозиторий. После этого вы будете заблокированы немедленно. Без персональных объяснений, почему так делать нельзя.
  • Попытка "наездов" с претензиями к авторам, которые "вам должны". Это больше относится к очевидным для большинства людей вещам. Мы вам продаём книгу: вы платите, магазин вам её предоставляет. На этом наш договор оканчивается, и мы вам больше не должны ничего (в т.ч. реклама не является публичной офертой). Всё остальное делается по доброй воле авторов.

К оглавлению ⮐

Надо ли обновляться и как?

Иногда - надо. В код или образ могут вноситься изменения. Если вы работаете с Git репозиторием, код обновляется следующим образом:

git pull

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

К оглавлению ⮐

Как собрать примеры?

Сборка производится, используя CMake, поэтому:

  • Вы можете использовать любую современную IDE для сборки.
  • Скрипт ./build.sh.
  • Прямой запуск CMake.

Сборка не подгружает зависимости автоматически. Поэтому, для того, чтобы собрать без необходимости заниматься установкой множества пакетов, используется подготовленная среда. Она представляет собой Docker-контейнер, образ которого лежит на docker.hub. Сборка в ней запускается через скрипт ./build_dockerized.sh.

Под Windows сборка была проверена на MSVS 2019 bkb MSVS 2022, и собранные артефакты будут находиться в src\out\build\windows-default\bin. Собираться под Windows будет не всё, есть примеры только под Linux.

К оглавлению ⮐

Сборка не проходит, вообще не собирается ничего

Может быть несколько причин из-за которых не проходит сборка. Для начала, убедитесь, что у вас:

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

Не делайте каталог вида: ~/Общедоступные/user/Пользователь\Артём/*Network Programming BOOK & Code*/本の宿題/Репозиторий?!/network-programming-book-code. Для большинства сборок - это верный путь к проблемам, о которых не знали авторы книги и разработчики CMake.

Конкретно в этом каталоге тоже не собирается.
~/Общедоступные/user/Пользователь\Артём/*Network Programming BOOK & Code*/本の宿題/Репозиторий?!/network-programming-book-code:master ✓ ➭ ./build.sh
CMake Error: The source directory "/home/artiom/Общедоступные/user/Пользователь/Артём/*Network Programming BOOK & Code*/本の宿題/Репозиторий?!/network-programming-book-code/src" does not exist.
Specify --help for usage, or press the help button on the CMake GUI.
Error: /home/artiom/Общедоступные/user/Пользователь/Артём/*Network Programming BOOK & Code*/本の宿題/Репозиторий?!/network-programming-book-code/build is not a directory

Но сборка в Docker-контейнере будет работать и отсюда.

Положите репозиторий в каталог с нормальным именем, например ~/projects/cpp-network-tasks.

Если вы уже собирали проект локально и хотите собрать его в Docker или, наоборот, собирали в Docker и хотите собрать локально, CMake выдаст ошибку, похожую на следующую:

CMake Error: The current CMakeCache.txt directory /home/user/projects/cpp-network-tasks/build/CMakeCache.txt is different than the directory /usr/src/gb/build where CMakeCache.txt was created. This may result in binaries being created in the wrong place. If you are not sure, reedit the CMakeCache.txt
CMake Error: The source "/home/artiom/user/cpp-network-tasks/src/CMakeLists.txt" does not match the source "/usr/src/gb/src/CMakeLists.txt" used to generate cache.  Re-run cmake with a different source directory.

Что говорит о том, что конфигурации CMake различаются, вы запускаете его в разном окружении.

Чтобы исправить это, удалите каталог build и запустите сборку заново:

➭ rm -rf build && ./build_dockerized.sh

К оглавлению ⮐

Почему используется Linux?

  • Потому что, на Linux и BSD системах работают большинство сетевых приложений.
  • Linux используют авторы.
  • Кроме Linux есть множество других ОС, и рассмотреть особенности каждой невозможно.
  • Перевод кода на Windows оговорён.
  • По возможности, код и так кроссплатформенный.

К оглавлению ⮐

Могу ли я собрать код на Windows?

Да, возможно собрать часть кода. Сборка проверялась на MS Visual Studio 2019 и 2022. Подробнее о поддержке CMake в MSVS, вы можете прочитать у Microsoft. Чтобы собрать код, надо открыть корневой CMakeLists.txt, как CMake проект.

Но есть следующие проблемы:

  • Есть код специфичный для Linux, например перехватчик вызовов, который будет собираться и работать только на этой платформе.
  • Некоторый код просто не был адаптирован для Windows, и его сборка выключена.
  • Есть редкие примеры, которые собираются, но работать корректно не будут (один из таких - асинхронный сервер на select()).
  • В Windows есть не все библиотеки, а CMake не имеет, например модуля для поиска Qt, если Qt не установлен. Это приводит к тому, что пример не просто нельзя собрать, если чего-то не хватает, а падает сборка. Конечно, возможно это исправить, если вы считаете, что нужно, репозиторий открыт для правок.
  • Надо установить Boost.

Также, есть некоторый код, специфичный для Windows.

К оглавлению ⮐

А есть что-то про CMake?

Есть:

К оглавлению ⮐

Docker - что это?

Предполагается, что в процессе работы с книгой, вы будете использовать поиск в Интернет. Соответственно, Google поможет. Если очень кратко, Docker - это один из вариантов реализации автоматизации инфраструктуры контейнеризации. Он позволяет изолировать приложения в контейнерах, образы которых скачаны из репозитория. Здесь он нужен для того, чтобы:

  • Вы могли собрать код, не устанавливая лишних библиотек в рабочую систему.
  • Вы могли проверить сборку тем же самым компилятором, что и авторы.

Напоминаем, что образ с инструкциями лежит на Docker.hub.

К оглавлению ⮐

Как использовать Docker?

На Windows только вместе с Linux подсистемой. На Linux его надо установить, а как, зависит от вашего дистрибутива. Например, в deb-based это делается по следующей инструкции.

К оглавлению ⮐

У меня сборка только под суперпользователем (root) запускается, почему?

Управлять Docker, в том числе и запускать или останавливать контейнеры могут только:

  • Пользователь root.
  • Пользователи в группе docker.

Добавить вашего пользователя в группу Docker возможно по-разному. Один из вариантов, который будет работать для многих дистрибутивов:

sudo usermod -a -G docker "${USER}"

После этого надо завершить сессию, например выйти на Login Screen, и снова войти.

К оглавлению ⮐

Могу ли я собирать в IDE?

Это зависит от IDE. Возможно использовать удалённую сборку по SSH (сервер установлен в образе), некоторые IDE, такие как CLion, поддерживают работу с Docker напрямую.

К оглавлению ⮐

CLion

Пример настройки CLion показан здесь.

Настройки конфигурации Docker показаны на скриншоте:

Изображение настройки конфигурации Docker

Настройки конфигурации CMake:

Изображение настройки конфигурации CMake

К оглавлению ⮐

QtCreator

Раньше QtCreator не поддерживал удалённую сборку по SSH.

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

Возможно самый просто вариант - установить QtCreator в контейнер и запустить оттуда. На данный момент для этого собран образ. Чтобы запустить его, используйте:

./run -q

QtCreator, запущенный в Docker

К оглавлению ⮐

Не могу подключиться к Docker либо IDE его не видит, что делать?

Проверьте:

  • Установлен ли у вас Docker. Если нет - установите.
  • Достаточно ли прав у вашего пользователя, что с Docker взаимодействовать.

В большинстве дистрибутивов, при установке Docker создаёт группу docker, что вы можете проверить, выполнив следующую команду:

$ grep docker /etc/group
docker:x:997:

Видно, что пользователя в этой группе нет. Добавьте его туда:

$ sudo usermod -a -G docker "$USER"
$ grep docker /etc/group
docker:x:997:artiom

После того, как вы перелогинитесь в системе, группа будет видна:

$ groups
sys network power video storage lp input audio wheel artiom docker

К оглавлению ⮐

В образе чего-то не хватает

Возможно, образ устарел. Обновите его. Также, возможно, что это ошибка. Такое случается. В этом случае вы можете завести Issue.

К оглавлению ⮐

Работая в Docker я не могу испортить систему?

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

К оглавлению ⮐

Как запустить собранное?

Если вы производили сборку, как указано выше, собранные бинарные файлы будут находиться в каталоге build/bin. Запустить вы их можете напрямую, однако из-за отсутствующих в системе зависимостей работать может не всё. Поэтому, запуск также производится в контейнере, используя команду ./run, которой передаются необходимые приложению аргументы и путь к нему.

Пример:

➭ ./run sudo ./build/bin/b01-ch04-ping-from-root google.com
Pinging "google.com" [142.250.113.113]
Raw socket was created...
Starting to send packets...
TTL = 255
Recv timeout seconds = 1
Recv timeout microseconds = 0
Sending packet 0 to "google.com" request with id = 33
Receiving packet 0 from "google.com" response with id = 33, time = 159ms
Sending packet 1 to "google.com" request with id = 33
Receiving packet 1 from "google.com" response with id = 33, time = 160ms

К оглавлению ⮐

Как запустить консоль?

Есть два варианта:

  • ./run
  • docker-compose run --rm nb - для тех, кто пользуется docker-compose.

Обратите внимание: консоль запускается через скрипт ./run в корне репозитория, не через docker run.

К оглавлению ⮐

Как обновить Docker образ?

Через docker-compose. В каталоге проекта нужно запустить:

➭ docker-compose pull

Или через Docker:

➭ docker pull "artiomn/nb-build-image"

К оглавлению ⮐

Где взять Netcat под Windows?

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

Внимание! Windows Defender может заблокировать Netcat, определив его, как Netcat.Hacktool. В таком случае, просто отключите "защиту реального времени".

К оглавлению ⮐

Всё делаю правильно, но что-то не подключается

Такая проблема была у одного разработчика. Он выяснил, что Netcat подключался на IPv6 адрес, тогда как сервер прослушивал только IPv4. Как исправить? Зависит от приложения. Задайте ему не доменное имя, а IPv4 адрес явно, при возможности. Для Netcat возможно использовать опцию -4 (не все реализации её поддерживают).

К оглавлению ⮐

Я нашёл ошибку в коде, могу ли я её исправить

Да. Следуя обычному процессу Guthub:

  • Сначала делаете форк репозитория.
  • Клонируете его, исправляете ошибку.
  • Делаете Pull request.

Или просто можете просто завести Issue. Но, в этом случае, обещать быстрое исправление мы не можем.

К оглавлению ⮐

Для контрибьюторов

В корневой директории имеется скрипт install_git_hooks.py, данный скрипт проверяет наличие установленного инструмента pre-commit, и, если его нет, устанавливает его. pre-commit - это инструмент для автоматизации проверок и тестов перед фиксацией (коммитом) изменений в репозитории Git. Он позволяет определить набор проверок и скриптов, которые должны быть выполнены перед тем, как изменения будут зафиксированы в репозитории. Использование pre-commit помогает поддерживать качество кода, уменьшает вероятность внесения ошибок и упрощает совместную работу.

Для самостоятельной установке необходимо открыть командную строку и ввести:

pip3 install pre-commit

После чего перейти в корневой репозиторий network-programming-book-code и ввести команду:

pre-commit install --install-hooks

Затем:

pre-commit run

Эта команда запускает все тесты необходимые для коммита.

Для правильной работы pre-commit и проверки cpp файлов необходимо также установить cppcheck, инструкция по настройке есть на самой странице, так же в данном мануале.

К оглавлению ⮐

Контакты с авторами

Если у вас есть, что сказать, заведите Issue. Либо обратитесь в Telegram канал по книге.

К оглавлению ⮐