Код для книги "Сетевое программирование".
- Начало работы
- FAQ
- У вас же тут всё идеально, точно без ошибок?
- Почему меня забанили?
- Надо ли обновляться и как?
- Как собрать примеры?
- Сборка не проходит, вообще не собирается ничего.
- Почему используется Linux?
- Могу ли я собрать код на Windows?
- А есть что-то про CMake?
- Docker - что это?
- Как запустить собранное?
- Как запустить консоль?
- Где взять Netcat под Windows?
- Всё делаю правильно, но что-то не подключается.
- Я нашёл ошибку в коде, могу ли я её исправить?
- Для контрибьютеров
- Контакты с авторами
Чтобы начать работать:
- Если 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
(первый каталог - ссылка).
Наоборот. Почти наверняка здесь есть ошибки. Книга - большой проект. Их появление неизбежно. Поэтому, если вы заметили ошибку, смело заводите 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.
Может быть несколько причин из-за которых не проходит сборка. Для начала, убедитесь, что у вас:
- Правильно настроен и работает Docker.
- Если это первая сборка, есть доступ в Интернет.
Далее, проверьте, что каталог в котором производится сборка, не содержит в пути не латинских символов, пробелов и спецсимволов.
Не делайте каталог вида: ~/Общедоступные/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 и BSD системах работают большинство сетевых приложений.
- Linux используют авторы.
- Кроме Linux есть множество других ОС, и рассмотреть особенности каждой невозможно.
- Перевод кода на Windows оговорён.
- По возможности, код и так кроссплатформенный.
Да, возможно собрать часть кода. Сборка проверялась на MS Visual Studio 2019 и 2022. Подробнее о поддержке CMake в MSVS, вы можете прочитать у Microsoft. Чтобы собрать код, надо открыть корневой CMakeLists.txt, как CMake проект.
Но есть следующие проблемы:
- Есть код специфичный для Linux, например перехватчик вызовов, который будет собираться и работать только на этой платформе.
- Некоторый код просто не был адаптирован для Windows, и его сборка выключена.
- Есть редкие примеры, которые собираются, но работать корректно не будут (один из таких - асинхронный сервер на
select()
). - В Windows есть не все библиотеки, а CMake не имеет, например модуля для поиска Qt, если Qt не установлен. Это приводит к тому, что пример не просто нельзя собрать, если чего-то не хватает, а падает сборка. Конечно, возможно это исправить, если вы считаете, что нужно, репозиторий открыт для правок.
- Надо установить Boost.
Также, есть некоторый код, специфичный для Windows.
Есть:
- CGold: The Hitchhiker’s Guide to the CMake.
- Уроки на Youtube.
- Документация.
- Много информации в Интернете.
Предполагается, что в процессе работы с книгой, вы будете использовать поиск в Интернет. Соответственно, Google поможет. Если очень кратко, Docker - это один из вариантов реализации автоматизации инфраструктуры контейнеризации. Он позволяет изолировать приложения в контейнерах, образы которых скачаны из репозитория. Здесь он нужен для того, чтобы:
- Вы могли собрать код, не устанавливая лишних библиотек в рабочую систему.
- Вы могли проверить сборку тем же самым компилятором, что и авторы.
Напоминаем, что образ с инструкциями лежит на Docker.hub.
На Windows только вместе с Linux подсистемой. На Linux его надо установить, а как, зависит от вашего дистрибутива. Например, в deb-based это делается по следующей инструкции.
Управлять Docker, в том числе и запускать или останавливать контейнеры могут только:
- Пользователь
root
. - Пользователи в группе
docker
.
Добавить вашего пользователя в группу Docker возможно по-разному. Один из вариантов, который будет работать для многих дистрибутивов:
sudo usermod -a -G docker "${USER}"
После этого надо завершить сессию, например выйти на Login Screen, и снова войти.
Это зависит от IDE. Возможно использовать удалённую сборку по SSH (сервер установлен в образе), некоторые IDE, такие как CLion, поддерживают работу с Docker напрямую.
Пример настройки CLion показан здесь.
Настройки конфигурации Docker показаны на скриншоте:
Настройки конфигурации CMake:
Раньше QtCreator не поддерживал удалённую сборку по SSH.
Есть вариант настройки с подмонтированием каталога через SSHFS. Но все пути к инклудам, а также библиотекам, естественно, будут некорректны, т.к. в контейнере они другие.
Возможно самый просто вариант - установить QtCreator в контейнер и запустить оттуда. На данный момент для этого собран образ. Чтобы запустить его, используйте:
./run -q
Проверьте:
- Установлен ли у вас 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.
Можете. Контейнер запускается в 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-compose. В каталоге проекта нужно запустить:
➭ docker-compose pull
Или через Docker:
➭ docker pull "artiomn/nb-build-image"
Например, здесь. Либо написать самостоятельно. Ведь это книга по сетевому программированию.
Внимание! 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 канал по книге.