LINUX.ORG.RU

Избранные сообщения vromanov

Простая и лёгкая реализация UDP/IP для микроконтроллеров

Новости — Hardware and Drivers
Группа Hardware and Drivers

Ориентирована на применение в системах, где микроконтроллер выступает в роли UDP сервера, с которым извне устанавливает «соединение» клиент (да, само по себе UDP соединений не имеет, я знаю):

  • Библиотека полностью событийно-ориентирована.
  • Не надо писать никаких структур состояния приложения.
  • Нет сокетов – только коллбэки на событие прихода пакета.
  • Всего 890 строчек кода.
  • Поддерживается ARP ответ, ICMP ответ, UDP.
  • Имеет ARP таблицу, заполняемую от входящих IP пакетов. При отправке IP пакета, если MAC адрес не найден, то библиотека шлёт IP с широковещательным MAC.

Не поддерживаются:

  • ARP запросы;
  • ICMP запросы;
  • маршрутизация;
  • DHCP;
  • DNS.

>>> Подробности

 , ,

cvs-255
()

Превратить беззнаковое число в знаковое

Форум — Development

Язык C. Имеем на входе беззнаковое число, например, uint32_t. Но на самом деле в нем находится, например, 25 битовое знаковое число. В 25-м бите признак отрицательного числа, в 26..32 битах нули. Размер числа в битах задаётся параметром. Как бы более правильно сделать функцию типа int32_t to_signed32(uint32_t value, uint8_t bits)? Вижу вариант с кучей юнионов (по одному на каждое количество битов), ну и всякая арифметика.

 , ,

vromanov
()

Оптимизированный циклический буфер

Форум — Development

Пользуйтесь на здоровье. Лицензии CC + BSD.

https://github.com/vitalyvch/rng_buf

PS: А на новость случайно не потянет?

 , , ,

cvv
()

Какая-то странная реализация memcpy в glibc

Форум — Development

Взял мастер, т.е. всё более-менее свежее.

Имеем:

void *
MEMCPY (void *dstpp, const void *srcpp, size_t len)
{
  unsigned long int dstp = (long int) dstpp;
  unsigned long int srcp = (long int) srcpp;

  /* Copy from the beginning to the end.  */

  /* If there not too few bytes to copy, use word copy.  */
  if (len >= OP_T_THRES)
    {
      /* Copy just a few bytes to make DSTP aligned.  */
      len -= (-dstp) % OPSIZ;
      BYTE_COPY_FWD (dstp, srcp, (-dstp) % OPSIZ);

      /* Copy whole pages from SRCP to DSTP by virtual address manipulation,
	 as much as possible.  */

      PAGE_COPY_FWD_MAYBE (dstp, srcp, len, len);

      /* Copy from SRCP to DSTP taking advantage of the known alignment of
	 DSTP.  Number of bytes remaining is put in the third argument,
	 i.e. in LEN.  This number may vary from machine to machine.  */

      WORD_COPY_FWD (dstp, srcp, len, len);

      /* Fall out and copy the tail.  */
    }

  /* There are just a few bytes to copy.  Use byte memory operations.  */
  BYTE_COPY_FWD (dstp, srcp, len);

  return dstpp;
}

Вроде всё self-documented, но поясню: Смотрим, достаточно ли байтов, чтобы копировать пачкой или не стоит мараться. Если достаточно, копируем следующим образом:

  1. Сначала копируем байтами, чтобы выровнять адресацию до 8, чтобы можно было копировать по выровненному адресу сразу по страницам. (BYTE_COPY_FWD)
  2. Копируем по 8 байт чтобы добить до размера страницы (внутри PAGE_COPY_FWD_MAYBE)
  3. Копируем по страницам сколько можем (внутри PAGE_COPY_FWD_MAYBE)
  4. Копируем по 8 байт сколько можем (WORD_COPY_FWD)
  5. Копируем байтами остатки. (BYTE_COPY_FWD)

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

(Для простоты опустим копирование страницами, для общего понимания проблемы оно сейчас не важно, тем более что в текущей реализации glibc для i386 оно ВНЕЗАПНО не реализовано) Положим на вход идут адреса 0x7f и 0x17f и нужно скопировать 20 байт.

  1. Чтобы добить до границы выравнивания по 8 копируем один байт из 0x17f в 0x7f (L теперь 19)
  2. Теперь копируем по 8 while (L>8).
  3. Добиваем остаток байтами.

Ура, мы скопировали. Никакого misalign access и все асаны-сасаны молчат.

А теперь берем адреса 0xf7 и 0x181

  1. Добиваем до границы 8 байт - копируем 1 байт. Теперь адреса 0x80 и 0x182
  2. Ииии… Всё, дальше копировать блоками нельзя - мы либо будем читать по невыравненному адресу либо писать, если попытаемся выровняться по источнику. ASAN и в том и другом случае мне жужжит, что если я хочу быть пай-мальчиком, то так нельзя.

Вопросы:

  • Почему у glibc это канает? Я прожамкал их сорцы, там нет решения этой проблемы.

Чтобы качнуть сорцы: git clone git://sourceware.org/git/glibc.git

P.S. Если знаете кого-то, кто на форуме может теоретически ответить - кастаните в тред, плиз. P.P.S. Это, конечно, забавно, что gcc на -O0/1/2 игнорит оптимизацию алгоритма и разворачивает его только на -О3 (xmm во все поля): https://gcc.godbolt.org/z/LpJg6s , но странно, что такой же реализации нет в glibc - одна из них все равно медленнее, почему не заменить более медленную реализацию более быстрой в одном из источников?

 , ,

PPP328
()

Второй кандидат в релизы libmdbx v1.0 после пяти лет разработки

Новости — Open Source
Группа Open Source

Библиотека libmdbx является существенно переработанным потомком LMDB — предельно высокопроизводительной, компактной встраиваемой базой данных класса ключ-значение. Текущая версия v0.5 является техническим релизом, отмечает завершение каких-либо доработок и переход к фазе публичного финального тестирования и стабилизации, с последующем формированием первого полноценного релиза библиотеки.

LMDB является достаточно известной транзакционной встраиваемой СУБД класса «ключ-значение» на основе дерева B+ без упреждающей журнализации, которая позволяет рою многопоточных процессов конкурентно и предельно эффективно работать с локально-разделяемой (не сетевой) БД. В свою очередь MDBX быстрее и надежнее LMDB, при этом libmdbx сохраняет все ключевые возможности своего прародителя, такие как ACID и неблокирующее чтение с линейным масштабированием по ядрам CPU, а также добавляет несколько новых.

Описание отличий и усовершенствований libmdbx относительно LMDB заслуживает отдельной статьи (планируется публикации на «Хабре» и «Medium»). Здесь же уместно упомянуть самые важные и заметные:

( читать дальше... )

 , , , mdbx,

Deleted
()

SPb: Разработчик на С

Форум — Job

Оклад от 100к

Компания ARRIVAL создает современный коммерческий электрический транспорт таким, каким он должен быть: доступным, элегантным, тихим и безопасным. Одна из наших основных задач - разработать электрический автомобиль, который будет стоить не дороже аналогичного автомобиля с бензиновым двигателем как по цене покупки, так и по стоимости владения. Чтобы этого достичь, мы стараемся оптимизировать каждый этап его создания - от проектирования, разработки всех компонент, используемых материалов и до программного обеспечения. Программное обеспечение автомобиля (от контроллеров движения до систем искусственного интеллекта), а также сопутствующие сервисы мы разрабатываем в Санкт-Петербурге, автомобили собираются в Банбери (Англия).

Мы ищем опытного разработчика ПО для автомобильного применения.

Обязанности:

  • разработка низкоуровневого и среднеуровневого ПО для контроллеров (ST SPC58xx - PowerPC);
  • отладка и тестирование в лабораторных условиях и на реальных объектах.
  • покрытие кода юниттестами

Требования и пожелания:

  • опыт работы с аналогичными задачами – от 3-х лет;
  • знание интерфейсов SPI, I2C, UART и т.д.;
  • знание автомобильных интерфейсов CAN и т.д.;
  • знание сред разработки (Eclipse) и контроля версий (git); лучше);
  • алгоритмы и структуры данных
  • английский (технический и письменное общение).
  • iso26262 будет большим плюсом

Условия:

  • Работа над уникальным для России проектом.
  • Достойная заработная плата по результатам собеседования.
  • Профессиональная слаженная команда, ориентированная на результат.
  • Условия работы: оформление по ТК РФ + доплата до 100% оклада для больничных и отпусков, полный пакет ДМС, компенсация затрат на занятия спортом и/или изучение иностранного языка, бесплатные горячие обеды в офисе.

Резюме прислайте на pripoten@arrival.com

 , ,

vromanov
()

Metaprog: универсальная графическая среда программирования [в разработке]

Форум — Development

Почему, несмотря на обилие «чудесных» ООП-языков, Си, разработанный в 1973 году, до сих пор не умер? Потому что не выхдящие за рамки текстового программирования попытки «улучшить» или заменить Си давали и дают проблем больше, чем решали.

Какой из ныне существующих языков программирования позволяет программировать мышкой, а не клавиатурой? На чем можно программировать графически, а не в тексте? Пока что это позволяет на приличном уровне только пропиетарное LabVIEW. Трудно поверить, но это единственная полностью графическая среда программирования серьезного уровня в 2019 году! Но даже в LabVIEW есть куча недостатков (которые невозможно самостоятельно устранить из-за пропиетарности).

Графическое программирование намного проще и понятнее. Если в качестве бэкенда брать Си и манипулировать функциями из сишной стандартной библиотеки, это не будет создавать никаких лишних абстракций, зато серьезно упростит жизнь программистам и особенно людям, имеющим дело с чужим кодом. Код любого уровня и любой сложности, представленный в виде графических блоков, станет открытым не только для узких специалистов, но и вообще любому продвинутому пользователю. Простота программирования и эффективность, не меньшая, чем у Си, убьет C++, Python, Java, Javascript и прочую ерунду с раздутыми и полными багов абстракциями (которые Линус не раз крыл матом).

Я уже делаю некое подобие LabVIEW на самом LabVIEW, назовем его Metaprog. Так же, как в 1991 Линус Торвальдс делал линукс, пользуясь пропиетарным Minix. И так же жаловался на кучу недостатков в Minix, желая устранить их в своей системе.

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

Примеры

Примеры с кодом на Си генерируются автоматически. Они тут же скармливаются компилятору и не предназначены для чтения эстетами, не любящими «абракадабру». Здесь они приведены лишь как пример работы транслятора и для возможности самостоятельно скомпилировать графические диаграммы со скринов. Так сказать, приобщиться к прекрасному.

Самое простое - Hello World. Скомпилируйте (gcc -o ./test ./code.c).

https://i.postimg.cc/YCywWbSh/fwrite.png

#include <stdio.h>

int main(){
char metaprog_array_pointer_10156130170823954432[] = {72,101,108,108,111,32,87,111,114,108,100};
unsigned long int metaprog_variable_13830126042312755200 = 1;
unsigned long int metaprog_array_size_10156130170823954432 = 11;
fwrite(metaprog_array_pointer_10156130170823954432,metaprog_variable_13830126042312755200,metaprog_array_size_10156130170823954432,stdout);

}

Я подписываю терминалы на украинском (сам оттуда), с таким же успехом их можно подписывать на русском, а не только на английском. Можно будет перевести все, кроме, разве что, вызываемых сишных функций, а gcc этого и не заметит (посмотрите код). При работе международной командой можно к каждой подписи/надписи прилагать словарь с нужными языками. Игры ж локализируют, чем визуальное программирование хуже?

Массив декларируется не как строка в кавычках, а как последовательность байтов, а байт - это цифра. Строки редактируются отдельным редактором (пока что средствами LabVIEW, но это временно). Больше никаких проблем и глюков с управляющими символами, кавычками итп (очень серьезная проблема при программировании на Си, Shell scripting и вообще всех текстовых языках).

Константа-массив имеет отдельные терминалы для указателя на массив и длины массива (известной редактору кода). Если терминал длины подключен - декларируется отдельная переменная. Не подключен - незачем и декларировать.

Пример посложнее: запись и в stdout, и в файл ./fwrite-test.txt

https://i.postimg.cc/v8KvKKmQ/fwrite2.png

#include <stdio.h>

int main(){
char metaprog_array_pointer_10156130170823954432[] = {72,101,108,108,111,32,87,111,114,108,100};
unsigned long int metaprog_variable_13830126042312755200 = 1;
unsigned long int metaprog_array_size_10156130170823954432 = 11;
fwrite(metaprog_array_pointer_10156130170823954432,metaprog_variable_13830126042312755200,metaprog_array_size_10156130170823954432,stdout);
char metaprog_array_pointer_12385851444566411264[] = {46,47,102,119,114,105,116,101,45,116,101,115,116,46,116,120,116,0};
char metaprog_array_pointer_16510743873862514688[] = {119,43,0};
fwrite(metaprog_array_pointer_10156130170823954432,metaprog_variable_13830126042312755200,metaprog_array_size_10156130170823954432,fopen(metaprog_array_pointer_12385851444566411264,metaprog_array_pointer_16510743873862514688));

}

В данном примере используется функция fwrite, а не printf. То есть, символ «0» не влияет на запись массива в файл или stdout. Сколько символов писать функция и так знает из длины массива.

Заявки

Принимаю заявки на новые фичи. Пишите в комментариях. Уже приняты заявки:

1. Пример с простым HTTP-сервером.

2. Пример с сортировкой Хоара (quicksort).

3. Простой в пользовании функционал работы со строками (больная тема для Си и С++).

4. Полностью графический функционал работы с регулярными выражениями, без вовлечения PCRE.

Сейчас нужно научить Metaprog «компилировать» блок-схемы прямо в Си и скармливать этот код gcc, получая бинарники. После чего перенести сам Metaprog на Си, чтоб перестать нуждаться в пропиетарном LabVIEW и выложить результаты в опенсорс. И получить за это донат, хотя желательно уже сейчас (для ускорения работы). Bitcoin:1AYoK2TScSpD5bhf67mv9AxHDJ2RidRvjD

 , , ,

metaprog
()

Протокол с коррекцией ошибок поверх uart

Форум — Development

По сути надо тот же подход к коррекции, что и в TCP, но для передачи данных через uart. Не просто CRC, а автоматическое повторение в случае не приема или неправильного приема.

Что то я как-то не нашел пока сам более менее готового варианта.

 , ,

cvs-255
()

SPB: Algorithm Test Engineer (Battery Management System)

Форум — Job

Оклад от 100к Требуемый опыт работы: 3–6 лет

Полная занятость, полный день

Компания ARRIVAL Ltd. создает autonomous ready коммерческий электротранспорт таким, каким он должен быть: доступным, элегантным, тихим, чистым и безопасным. Программное обеспечение автомобиля (от контроллеров движения до панели управления) мы разрабатываем в Санкт-Петербурге, электрогрузовики собираются в Англии.

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

Вашими задачами будут:

  • Анализ требований;
  • Составление тест-планов;
  • Написание тест-кейсов;
  • Создание тестов;
  • Запуск тестов и анализ результатов их прохождения.

От вас мы ждем:

  • Отличные знания и опыт работы с Matlab Simulink;
  • Опыт тестирования алгоритмов систем управления и анализа результатов их прохождения;
  • Опыт разработки алгоритмов систем управления как преимущество;
  • Навыки автоматизации тестирования как преимущество;
  • Знание английского языка на уровне чтения технической литературы и письменного общения.

Мы предлагаем:

  • Работа над уникальным для России проектом;
  • Оформление по ТК РФ + доплата до 100% оклада для больничных и отпусков;
  • Полный пакет ДМС;
  • Компенсация затрат на занятия спортом и/или изучение иностранного языка;
  • Адрес: Санкт-Петербург, Лахтинский проспект;
  • Полная занятость.

Ключевые навыки

Simulink Алгоритмы Тестирование

 ,

vromanov
()

SPb: Разработчик ПО встраиваемых систем под микроконтроллеры и ПЛИС

Форум — Job

Оклад от 100к

Компания ARRIVAL Ltd. создает autonomous ready коммерческий электротранспорт таким, каким он должен быть: доступным, элегантным, тихим, чистым и безопасным. Программное обеспечение автомобиля (от контроллеров движения до панели управления, а также сопутствующие сервисы) мы разрабатываем в Санкт-Петербурге, автомобили собираются в Англии.

Мы ищем опытного инженера- разработчика для реализации проектов управления системами автомобиля.

Вашими задачами будут:

  • Разработка, тестирование и валидация ПО встраиваемых систем для проектов силовой электроники.
  • Интеграция FPGA с микропроцессорными и микроконтроллерными системами.
  • Разработка библиотеки синтезируемых модулей для реализации алгоритмов встраиваемых систем управления.

От вас мы ждем:

  • Высшее техническое образование.
  • Знание и опыт разработки под микроконтроллеры/микропроцессоры (MCU/DSP) на С/С++ от 3-х лет.
  • Опыт разработки преобразовательной техники (AC/DC, DC/DC, PFC).
  • Знание и опыт разработки на Verilog и VHDL.
  • Понимание и знание современной архитектуры FPGA.
  • Знание и опыт работы с FPGA и CPLD (Intel/Altera, или Xilinx, или Lattice) от 2-х лет.
  • Знание принципов оптимизации проектов для FPGA.
  • Знание цифровой схемотехники и принципов цифровой обработки сигналов.
  • Понимание и/или готовность к изучению принципов проектирования с учетом функциональной безопасности.
  • Знание и опыт отладки проектов с помощью встроенного логического анализатора.
  • Опыт работы с измерительной аппаратурой.
  • Знание английского языка на уровне не ниже чтения технической литературы.

Преимуществами будет:

  • Знание и опыт работы в Matlab Simulink.
  • Понимание теории и принципов построения современных цифровых систем управления.
  • Наличие представления о принципах построения мощных современных преобразователей энергии.
  • Знание и понимание принципов верификации ПО. Опыт написания testbench (модулей тестирования) на SystemVerilog со 100% покрытием кода.

Условия:

  • Работа над уникальным для России проектом.
  • Достойная заработная плата по результатам собеседования.
  • Профессиональная слаженная команда, ориентированная на результат.
  • Условия работы: оформление по ТК РФ + доплата до 100% оклада для больничных и отпусков, полный пакет ДМС, компенсация затрат на занятия спортом и/или изучение иностранного языка, бесплатные горячие обеды в офисе.

 , ,

vromanov
()

как сделать интервальные счетчики в проге на си

Форум — Development

всем привет!

Вопрос следующий.

Каким самым верным способом можно реализовать подсчет некоторых событий в программе и сохранять эти данные допустим в файл по истечении заданного интервала?

Например, в коде идет подсчет какого либо события. Как каждый час сохранять этот счетчик?

Сигналы по таймеру? или есть что то другое, более правильное?

Как фиксировать допустим каждый час значение определенной метрики. Вот наверное главный вопрос...

Заранее спасибо!

 ,

elmir_k
()

nanomsg vs zeromq

Форум — Development

Привет, ЛОР.

Мы тут адово используем zeromq, но я в последнее время с интересом поглядываю на nanomsg, и в связи с этим хочу услышать местные истории успеха. Например, «я перешёл с zeromq на nanomsg, и мои волосы стали длинными и шёлковистыми, а жена наконец смогла забеременеть» или «после внедрения nanomsg мой брат умер от передозы этой дрянья». Просто список недостатков библиотеки, которые пришлось обходить, тоже подойдёт.

Спасибо.

 nanomsg,

hateyoufeel
()

Centos 7.3 (RHEL 7.3) - переключение клавы по Ctrl-Shift

Форум — Desktop

Добрый день! В Gnome 3 есть баг - нет возможности поставить в качестве преключалки клавы Ctrl-Shift. Никто не фиксил проблему?

 ,

vromanov
()

Помогите нагуглить военный стандарт написания на C

Форум — Development

Чет вместо US Military C coding convention гуглится все что угодно кроме того что надо.

 ,

someoneelsenotme
()

Хочу стать программистом C/Linux в 32 года

Форум — Talks

Мне почти 32 года. До этого немного программировал как хобби. Хочу профессионально устроиться разработчиком в области C/Linux или встроенные системы.

Последние несколько месяцев изучал алгоритмы, язык C и низкоуровневое программирование. Сейчас начал читать книгу Керриска по Linux.

Какие мои шансы получить свою первую работу джуниором (в любом городе), скажем, через 4 месяца? К этому времени изучу 2/3 Керриска. Вообще приветствуются любые советы.

Перемещено tailgunner из job

 , , ,

Graduate
()

Псевдографика в буфер обмена Tera Term

Форум — General

Проблема: Под офтопиком подключаюсь при помощи Teraterm. Пытаюсь скопировать в буфер обмена текст с псевдографикой и вставить в текстовый редактор. Вместо псевдографики получаю буковки. Кто знает, как поменять такое поведение?

 , ,

vromanov
()

Получить значение поля структуры

Форум — Development

Задача такая - есть описание поля структуры в формате - стартовый бит (может быть не кратным 8), длинна в битах (1..64), знаковость, LSB или MSB. Надо получить значение. Предполагается, что структура упакованная и может содержать битовые поля. Ну и чтобы было интереснее все это должно работать очень быстро и на процессорах как LSB так и MSB. Arm. Может есть какой-то правильный способ?

 ,

vromanov
()

Как заливать в stm32f103 через последовательный порт

Форум — Development

Имеется вот такая игрушка http://www.ebay.com/itm/STM32F103C8T6-ARM-STM32-Minimum-System-Development-Bo...

Есть желание кодить в нее с libopencm3, но нет понимания как туда заливать. На сайте libopencm3 предлагают юзать openocd но похоже что он не может просто так взять и залить через последовательный порт, а умеет только через stlink.

Есть ли у меня шанс сэкономить 6$ и три недели ожидания, или таки без stlink никак?

Кстати, у меня получилось подружить эту штуку и arduino ide. Все кодится, все заливается. Может есть возможность подружить arduino ide с libopecm3? Такой вариант тоже годится.

 , ,

redixin
()

Вакансия embedded разработчик (stm32, tms570), SPb, от 80 кр

Форум — Job

Разработка по для контроллеров (телематика, автомобильная тема) Требования:

  • опыт работы с аналогичными задачами – от 3-х лет;
  • знание RTOS (Chibios, FreeRTOS);
  • Желательно знание автомобильных интерфейсов CAN, LIN, итд
  • Знание С
  • Знание алгоритмов и структур данных
  • Знание особеностей MCU stm32. Плюсом будет знание tms570
  • Большим плюсом будет знание tms570
  • Знание сред разработки и контроля версий

Обязанности:

  • участие в разработки с начального этапа, от выбора аппаратной платформы (контроллеров) и программной среды разработки ПО;
  • разработка встраиваемого ПО – драйверов протоколов, системы опроса, фильтрации, временного хранения (накопления) данных, взаимодействия с системой верхнего уровня по различным каналам связи;
  • отладка и тестирование ПО в лабораторных условиях и на реальных объектах;
  • взаимодействие с другими разработчиками в группе (аппаратной и программной частей);

Условия:

  • гарантии по ТК РФ (полностью белая компания);
  • медицинская страховка, корпоративная мобильная связь;
  • офис - п. Ольгино. Прямо напротив платформы
  • Удобный офис

Пишите - romanov@charge.org

 ,

vromanov
()

SOCK_STREAM и особенности работы с ним

Форум — Development

Правильно ли я понимаю, что если есть такой серверный алгоритм:

int sfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

struct sockaddr_in {
    sa_family_t    sin_family; /* address family: AF_INET */
    in_port_t      sin_port;   /* port in network byte order */
    struct in_addr sin_addr;   /* internet address */
};

sockaddr_in addr = { AF_INET, htons(port), { htonl(INADDR_ANY) } };
bind(sfd, &addr, sizeof(addr));

while (working) {
    sockaddr_storage peer;
    socklen_t sockLen = sizeof(peer);

    int fd = accept(sfd, &peer, &sockLen);
    if (fd != -1) {
        #define BUF_SIZE 256
        char buf[BUF_SIZE];

        ssize_t size = recv(fd, buf, BUF_SIZE, MSG_WAITALL);
        if (size != -1) {
            cout << "Got message: " << buf << endl;
        }

        close(fd);
    }
}

close(sfd);
* Тут я упростил всё во благо читабельности.

То клиент, чтоб отослать сообщение, должен каждый раз создавать новый сокет и писать в него? Т.е.:

void sendMessage(const std::string &message) {
    int sfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    sockaddr_in addr = { AF_INET, htons(port), { htonl(INADDR_LOOPBACK) } };
    connect(sfd, &addr, sizeof(addr));

    send(sfd, message.c_str(), message.size(), 0);

    close(sfd);
}

P.S. В реальном коде использую getaddrinfo() + AF_UNSPEC.

 , , ,

KennyMinigun
()