Учебный проект: реализация упрощённого аналога утилиты ping на C++.
Проект разрабатывается на macOS с использованием CLion + CMake + C++20.
Цель проекта — изучение:
- raw sockets
- протокола ICMP
- сетевого программирования на C++
- POSIX API
- CMake
Сейчас реализовано:
- ICMP Echo Request (type=8/code=0) + checksum
- Отправка/получение пакетов через
sendto()/recvfrom()(с таймаутом) - RTT измерение
- Циклический ping (несколько запросов)
- TTL вывод
- Статистика как в
ping(packet loss, min/avg/max/stddev) - Обработка аргументов командной строки (например,
-c,-W,-i) - Unit-тесты без необходимости
sudo:checksum_testicmp_packet_test
Пример вывода:
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=57 time=12.345 ms
- macOS
- clang / AppleClang
- CMake >= 3.20
- root-доступ (для raw sockets)
Проверка:
clang++ --version
cmake --versionping/
├── CMakeLists.txt
├── src/
│ ├── main.cpp
│ ├── ping.cpp
│ ├── icmp.cpp
│ └── ...
└── tests/
├── checksum_test.cpp
└── icmp_packet_test.cpp
Из корня проекта:
cmake -S . -B cmake-build-debug
cmake --build cmake-build-debug --target pingПосле сборки появится бинарник:
cmake-build-debug/ping
Raw sockets требуют root-прав.
Запуск:
sudo ./cmake-build-debug/ping 8.8.8.8Ожидаемый вывод:
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=57 time=12.345 ms
Без root-прав будет ошибка:
socket: Operation not permitted
Проект содержит unit-тесты, которые можно запускать без sudo.
Сборка тестов + прогон через CTest:
cmake -S . -B cmake-build-debug
cmake --build cmake-build-debug --target checksum_test icmp_packet_test
ctest --test-dir cmake-build-debug --output-on-failure- C++20
- POSIX sockets API
- ICMP protocol
- CMake
- AppleClang
Компилятор:
Apple clang 17+
Флаги компиляции:
-Wall -Wextra -Wpedantic
Стандарт языка:
C++20
Идеи для дальнейшего развития (не реализовано):
- hostname → IP (DNS)
- IPv6 (ICMPv6)
- опции
-s(размер payload),-t(TTL),-D(timestamp) - opt-in интеграционный тест, который реально шлёт/получает ICMP (будет требовать
sudo)
sudo ./cmake-build-debug/ping -c 2 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=57 time=12.3 ms
64 bytes from 8.8.8.8: icmp_seq=1 ttl=57 time=11.8 ms