C++ geek
3.68K subscribers
272 photos
3 videos
22 links
Учим C/C++ на примерах
Download Telegram
Давай программировать стек TCP/IP. Part 2: IPv4 & ICMPv4

На этот раз в нашем TCP/IP стеке в пространстве пользователя мы реализуем минимально жизнеспособный IP-уровень и протестируем его с помощью ICMP-запросов эхо (известных также как ping).

Мы рассмотрим форматы IPv4 и ICMPv4 и опишем, как проверять их целостность. Некоторые функции, такие как фрагментация IP, оставлены в качестве упражнения для читателя.

Для нашего сетевого стека был выбран IPv4 вместо IPv6, так как он до сих пор является основным сетевым протоколом Интернета. Однако это быстро меняется, и наш стек можно будет расширить поддержкой IPv6 в будущем.

Internet Checksum
Поле интернет-контрольной суммы используется для проверки целостности IP-дейтаграммы. Вычисление контрольной суммы относительно простое и определено в оригинальной спецификации:

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

Фактический код для алгоритма выглядит следующим образом:


uint16_t checksum(void *addr, int count)
{
/* Compute Internet Checksum for "count" bytes
* beginning at location "addr".
* Taken from https://tools.ietf.org/html/rfc1071
*/

register uint32_t sum = 0;
uint16_t * ptr = addr;

while( count > 1 ) {
/* This is the inner loop */
sum += * ptr++;
count -= 2;
}

/* Add left-over byte, if any */
if( count > 0 )
sum += * (uint8_t *) ptr;

/* Fold 32-bit sum to 16 bits */
while (sum>>16)
sum = (sum & 0xffff) + (sum >> 16);

return ~sum;
}


https://www.saminiir.com/lets-code-tcp-ip-stack-2-ipv4-icmpv4/

➡️ @cpp_geek
👍2🔥1
Давай программировать стек TCP/IP. Part 3: TCP Basics & Handshake

Теперь, когда наш стек TCP/IP в пользовательском пространстве имеет минимальные реализации для Ethernet и IPv4, пришло время рассмотреть работу протокола управления передачей (Transmission Control Protocol, TCP).
Работающий на четвертом сетевом уровне OSI1, транспортном, TCP отвечает за восстановление ошибочных соединений и ошибок в доставке пакетов. По сути, TCP - это рабочая лошадка Интернета, обеспечивающая надежную связь практически во всех современных компьютерных сетях.
TCP не совсем новый протокол - первая спецификация вышла в 1974 году2. С тех пор многое изменилось, и TCP обзавелся множеством расширений и исправлений3.
В этой статье мы рассмотрим основные теоретические основы TCP и попытаемся дать мотивацию для его разработки. Кроме того, мы рассмотрим заголовок TCP и обсудим установление соединения (TCP handshaking). В качестве последнего шага мы продемонстрируем первую функциональность TCP в нашем сетевом стеке.


https://www.saminiir.com/lets-code-tcp-ip-stack-3-tcp-handshake/

➡️ @cpp_geek
👍31🔥1
std::tie

std::tie — это функция, которая создает кортеж ссылок на lvalue из своих аргументов или экземпляров std::ignore.

Она может использоваться для распаковки кортежей или пары значений в отдельные переменные. Например, если у вас есть функция, которая возвращает std::pair или std::tuple, вы можете использовать std::tie, чтобы присвоить значения этого кортежа отдельным переменным.

В этом примере мы используем std::tie для распаковки результата вызова set_of_s.insert(value) в две переменные: итератор iter и логическую переменную inserted.
Это позволяет нам проверить, было ли значение успешно вставлено в набор.

➡️ @cpp_geek
👍41
В чем разница между git fetch и git pull?

Разница между этими командами заключается в том, что когда вы используете команду git fetch, Git извлекает последние изменения из удаленного репозитория в ваш локальный репозиторий, но оставляет эти изменения в отдельной ветке git origin.

А команда git pull извлекает и интегрирует (скачивает и сливает) последние изменения из удаленного репозитория в вашу текущую ветку работы.

➡️ @cpp_geek
👍8
Execution policy для параллельных алгоритмов

Execution policy в C++ — это новшество, введенное в стандарте языка C++17. Это механизм, который позволяет выбрать, как именно должны выполняться алгоритмы в стандартной библиотеке: последовательно или параллельно.

Существуют три варианта execution policy:

- seq: выполняет алгоритм последовательно.
- par: выполняет алгоритм параллельно, используя все доступные ядра процессора.
- par_unseq: выполняет алгоритм параллельно и может использовать неупорядоченное исполнение.

Execution policy может быть использован в комбинации с многими алгоритмами в стандартной библиотеке, такими как std::for_each, std::transform, std::reduce и другими. Например, код выше выполняет алгоритм std::for_each параллельно.

➡️ @cpp_geek
4👍1🙈1
Задача

Найти среднее арифметическое в трех рядах.

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

Теперь подумаем, какие переменные нам понадобятся:

Переменная summa — для суммы чисел каждого ряда;
Переменная average — для среднего арифметического каждого ряда;
Переменная number — обычное число которое мы будем постоянно прибавлять;
Переменные i и j — для циклов, перпенные у нас будут локальные, т.е. использоваться и объявляться в цикле.

➡️ @cpp_geek
🤡8👍32
Готовы с нуля создавать телекоммуникационные решения для беспроводных мобильных сетей и сопутствующих услуг? 🧑‍💻

Отправляйте резюме до 19 октября и присоединяйтесь к команде YADRO Телеком!

Как получить оффер за 3 дня? Листайте карточки выше — все подробности там!

💙 Оставляйте заявку — мы ждём именно вас!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🤡31👍1
Dependency Injection

Dependency Injection (DI) — это паттерн проектирования, который позволяет управлять зависимостями между объектами. Он помогает разделить создание объектов от их использования и обеспечить более гибкую и тестируемую архитектуру программы.

В DI объекты получают свои зависимости не напрямую, а через внешний источник, который их предоставляет. Этот источник называется контейнером внедрения зависимостей. Контейнер отвечает за создание и управление зависимостями, а объекты получают их через конструкторы, методы или свойства.

➡️ @cpp_geek
👍7
Что случится, если exception выйдет за пределы потока?

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

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

➡️ @cpp_geek
👍21
std::hash

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

std::hash используется, например, в ассоциативных контейнерах, таких как std::unordered_map и std::unordered_set, для быстрого доступа к элементам по ключу.

Для пользовательского типа данных требуется явная специализация структуры std::hash для корректной работы хэширования.

➡️ @cpp_geek
4👍2❤‍🔥1