Задать вопрос
  • Как подключить впн для разных приложений в mac os?

    @res2001
    Developer, ex-admin
    ВПН часто конфигурируется с добавлением маршрута по умолчанию, т.е. весь трафик с компа отправляется в ВПН.
    Как правило, для рабочего ВПН этого не нужно. Там обычно достаточно добавить один или несколько маршрутов до локальной офисной сети. Какие именно маршруты добавлять - должны сказать администраторы. Таким образом только трафик до этих внутренних офисных сетей будет идти через ВПН.
    Второй ВПН, который для интернета - тут уже может добавляться маршрут по умолчанию и весь остальной трафик будет идти на этот ВПН.
    Маршрутов по умолчанию теоретически может быть несколько, но работать будет только 1 с меньшей (или большей, не помню точно) метрикой.
    Так что из всего вышесказанного, можно сделать вывод, что ВПНов на компе можно держать подключенными сколько угодно много, но с оговорками:
    1. только 1 ВПН должен изменять маршрут по умолчанию
    2. у всех других ВПНов не должны пересекаться маршруты (адресация внутренних сетей за ВПН сервером), иначе начнется то же самое - будет работать только 1 из них.
    В целом все эти проблемы - это не про ВПН, собственно, это про стандартную маршрутизацию IP трафика, которая работает одинаково на всех устройствах, где есть протокол TCP/IP.
    Ответ написан
    Комментировать
  • Pthread, чистый си, откуда ошибка сегментирования?

    @res2001
    Developer, ex-admin
    Потоки - это не корутины совсем.
    Корутины выполняются в одном потоке, последовательно.
    Потоки выполняются параллельно на многоядерной/многопроцессорной системе.

    Ошибка у вас в вызове pthread_create. Нужно примерно так:
    pthread_create(&t1, NULL, zapis_v_terminal, NULL);
    Потоковая функция zapis_v_terminal() должна соответствовать сигнатуре. Посмотрите man pthread_create там это написано. Последний параметр pthread_create является аргументом потоковой функции. У вас там сейчас NULL. Обычно все же в потоки передают какую-то информацию, хотя в простейшем случае можно использовать глобальные переменные.

    Вам не надо делать detach(), наоборот перед выходом из main делайте join() обоих потоков, т.е. дождитесь завершения потоков, только потом выходите из main().
    Чаще всего detach() не требуется и даже вреден. Лишь в ограниченных случаях можно/нужно использовать detach() потоки. Ваш случай не такой.
    Ответ написан
    Комментировать
  • Как добавить библиотеки в CMakeLists?

    @res2001
    Developer, ex-admin
    Ответ в комментарии
    Ответ написан
    Комментировать
  • Как правильно указать путь к пнг файлу в SFML при работе с Cmake?

    @res2001
    Developer, ex-admin
    Обычно ошибка о том, что файл не найден звучит как "File not found" ну или что-то типа того.
    Какая реализация обработки ошибок в SFML я не в курсе, может там одно сообщение на все ошибки.

    Сейчас в качестве костыля просто укажите полный путь к папке для исключения варианта ошибки с не найденным файлом.

    Но для нормальной программы, которая должна установиться в систему и нормально после этого работать, надо этот вопрос решить кардинально. Сейчас вы указываете относительный путь. Относительный он относительно каталога src. Но программа ваша стартует наверняка не из каталога src, а где-то из src/../build например или вообще из произвольного каталога. Поэтому найти файл по такому относительному пути она в принципе не может. При указании относительного пути обычно предполагается наличие подкаталога sprites в текущем каталоге. Но текущий каталог - это почти наверняка не каталог src и это может быть даже не каталог в котором реально лежит исполняемый файл программы.

    Для начала надо определиться для себя где будет лежать каталог sprites во время работы программы. Тут вариантов несколько, в т.ч. и зависимые от ОС:
    1. в текущем каталоге - вариант плохой, т.к., как писал выше, при запуске программы текущий каталог может быть произвольным в файловой системе и от вас в общем случае это не зависит.
    2. в каталоге где лежит исполняемый файл. То же не очень. Для винды в принципе подходит, для линукса нет, т.к. там все бинарники обычно лежат в своих директориях (/usr/bin, ...), а сопутствующие файлы где-то в другом месте (см.ниже).
    3. В каталоге программы размещенном в профиле пользователя или в общем профиле - этот вариант обычно и используют. Для винды это может быть подкаталог вашей программы в каталоге определенном в переменной окружения %APPDATA% или в %ALLUSERSAPPDATA%. Для линукса есть аналогичные каталоги см. документ Filesystem Hierarchy Standard.
    4. В каталоге указанном в параметрах командной строки при запуске программы (в конфигурационном файле, в реестре, где-то еще). Но при этом надо будет подумать, где хранить собственно сам файл с настройками. Самый простой в реализации способ - указать в параметрах командной строки.

    Потом в коде программы вы на основании этого соглашения с самим собой строите абсолютный путь к каталогу sprites и загружаете файлы по абсолютному пути.
    Ответ написан
    Комментировать
  • Как можно автоматически собрать IP адреса к которым обращается программа?

    @res2001
    Developer, ex-admin
    Чтоб узнать по каким адресам обращается программа можно использовать любой сетевой сниффер, например Wireshark. Но это может быть не совсем просто и потребует разобраться с фильтрацией и т.п.
    В винде из коробки есть "монитор ресурсов", это не сниффер, конечно, но информация о соединениях (и адресах) процессов там есть. Ту же информацию можно получить в командной строке с помощью утилиты netstat (см. netstat /?).
    В линуксе то же есть тот же netstat, правда это не совсем то же, что netstat в винде, но вам сгодится.
    Ответ написан
    Комментировать
  • SSTP сервер на Linux, как?

    @res2001
    Developer, ex-admin
    На стандартной убунте использую для SSTP network-manager-sstp-gnome, у него в зависимостях network-manager-sstp и sstp-client. Комбайны не люблю, поэтому softether не исопльзую.
    Нормально интегрирован в оболочку, собственно, сам network-manager-sstp-gnome - это гномовская разработка, поэтому тут с интеграцией все нормально. sstp-client, которого он использует под капотом (через pppd на сколько я понимаю) - сторонняя.
    Так же можно руками настроить sstp-client через pppd, инструкция есть от разрабов на гитхабе.
    Ответ написан
  • Почему длина long int 4 байта?

    @res2001
    Developer, ex-admin
    В Си так же как и в плюсах размер целочисленных типов не фиксирован, есть только ограничения, что
    sizeof(int) >= sizeof(short) >= sizeof(char) и т.п.

    Если для большинства типов, все таки размеры более-менее устоявшиеся для широкоиспользуемых архитектур и компиляторов, то в случае с long int все сложнее и действительно зависит от ABI. Т.е. даже на одной платформе но на разных компиляторах размер может быть разным. Например, сравните размеры типов в микрософтовском компиляторе и в mingw64 под 64 битной виндой на одном и том же компе.
    Кстати, не забудьте, что есть еще long long int.
    Чтоб не зависеть от подобных вещей рекомендую использовать типы с фиксированной длиной int32/int64 и т.п., которые объявлены в stdint.h

    Размеры типов с плавающей точкой float/double как раз стандартизованы, но не стандартами Си/С++, а стандартом IEEE754.
    Размер указателей - зависит от архитектуры. На 32 битных процессорах обычно это 4 байта, на 64 битных процессорах - 8.
    Ответ написан
    1 комментарий
  • Как удалить бесконечно рекурсивную папку?

    @res2001
    Developer, ex-admin
    Проверьте диск на целостность: chkdsk /? или гуёвым вариантом.
    Бесконечных вложенностей не бывает, у всего есть предел.
    Как-то в похожей ситуации удалось удалить файл, который другими средствами не удалялся, загрузившись с установочной флешки ubuntu в live режиме и примонтировав в линукс виндовый раздел.
    Ответ написан
    Комментировать
  • Длина payload в ethernet 802.3 кодируется всего двумя байтами. Как?

    @res2001
    Developer, ex-admin
    1. Максимальное значение, которое можно записать в 2 байта - 0xFFFF, т.е. 65535
    2. Если внимательно посмотришь стандарт IEEE 802.3 п.3, то там поле, которое ты называешь length называется Length/Type. Т.е. это не просто length - это такой зверь в двойном обличии. Если значение этих двух байт <=0x600 то это поле воспринимается как length. Если >0x600, то это Type. Под Type в данном случае понимается EtherType. Например для протокола IP EtherType == 0x800. Некоторые значения EtherType можешь посмотреть на вики: https://en.wikipedia.org/wiki/EtherType.
    К слову, на сегодняшний день в типичной сети почти всегда это поле интерпретируется как EtherType. В этом случае длина пакета должна быть закодирована на уровне вышестоящего протокола, т.е. где-то там в payload.
    Реально у Ethernet есть другой способ определения длины пакета - после завершения передачи происходит удаление сигнала carrierSense и межфреймовая задержка. По этим признакам физика понимает, что пакет получен. После этого уже можно проверить Length/Type, посчитать контрольную сумму и провести другие проверки.
    3. Интерпретация Length используется для протокола LLC (IEEE 802.2), если я правильно помню.
    Ответ написан
    Комментировать
  • Какие есть онлайн-редакторы кода, чтобы развернуть на своем ПК, но обращаться с других машин как к веб-странице?

    @res2001
    Developer, ex-admin
    Доступа к ftp, ssh, rdp итд нет и никак невозможно получить.

    Т.е. доступа к одним портам нет, а к HTTPS/HTTP есть. Странно. Это у вас в офисе блокируют другие порты или другие причины?
    На мой взгляд вашим требованиям отвечает VSCode, даже не web версия. Повесте на HTTPS порт (tcp/443) на удаленном компе ssh сервер и используйте vscode через ssh.
    Кроме того в этом же флаконе получаете доступ к командной строке, как через тот же vscode так и через любой клиент ssh.
    Ответ написан
    Комментировать
  • Может ли мобильный оператор блокировать интернет при подключении компьютера?

    @res2001
    Developer, ex-admin
    Может ли мобильный оператор блокировать интернет при подключении компьютера?

    Может и делает, если тариф не позволяет раздачу интернета. Обычно в тарифах это оговаривается отдельно и у операторов, как правило, есть отдельные тарифы для роутеров.
    Раньше блокировали через анализ TTL. Но, похоже, сейчас это происходит как-то по другому, не слежу особо за темой.

    Но судя по описанию проблема не в операторе. См. ответ rPman

    Проще всего проверить работу ноутбука - попробуйте подключиться к любой другой WiFi сети с него. Если будет работать нормально - меняйте роутер.
    Ответ написан
    Комментировать
  • Есть ли реальные проблемы с безопасностью windows 7 для домашнего использования?

    @res2001
    Developer, ex-admin
    У Вин7 закончилась поддержка производителя: https://learn.microsoft.com/en-us/lifecycle/produc...
    Обновлений безопасности уже не будет.
    Я бы на вашем месте озаботился бы апгрейдом, иначе риск пострадать от какой-то уязвимости будет постоянно увеличиваться.

    PS: Кстати и поддержка Вин10 то же скоро закончиться.
    Но тут могут еще добавить расширенную поддержку, когда будут выпускать обновления безопасности.

    UPD: И еще, со временем начнете сталкиваться (если уже не начали) с тем, что новый софт не хочет вставать на вашу старую винду. В этом случае, обычно и софт берут более старой версии, если есть такая возможность. И, соответственно, у вас теряется опция обновления софта и получения какого-то нового функционала от новых версий.
    Ответ написан
    1 комментарий
  • Как отформатировать вывод cmd?

    @res2001
    Developer, ex-admin
    Засуньте это в батник и выполните в консоли:
    @echo off
    for /f "tokens=4" %%a in ('netsh wlan show networks mode^=bssid ^| findstr /c:"BSSID 1" ') do echo %%a
    Ответ написан
    Комментировать
  • Внешний ip перенаправляет на роутер, как убрать?

    @res2001
    Developer, ex-admin
    Сделайте так, чтоб компьютеры внутри сети ходили на внутренние сервисы по внутреннему адресу, а не по внешнему. Это можно сделать добавив соответствующие записи в файл hosts.
    Ответ написан
  • Как корректно вывести функцию в байтовом виде?

    @res2001
    Developer, ex-admin
    Что мешает предусмотреть варианты когда f < _end и f > _end?
    https://godbolt.org/z/8M33E4PYo
    Но это не гарантирует, что компилятор чего-нибудь не вставит между функциями. О чем и говорит итоговый выхлоп.
    И еще выхлоп может быть разным при разных флагах оптимизации: -O0/1/2
    Ответ написан
    Комментировать
  • Что стоит делать в 16 лет, если планирую стать специалистом в системном программировании?

    @res2001
    Developer, ex-admin
    В 16 лет, если вы еще в школе, следует готовиться к поступлению в профильный институт/университет.

    Раз вы уже выбрали себе примерное направление будущей деятельности, то есть смысл просмотреть программу факультета и выбрать наиболее для вас подходящую специальность.
    Это не обязательно должно быть именно "системное программирование", т.к. сюда можно отнести много чего, но это должно быть что-то приближенное либо к железу (встраиваемые системы) либо к ядру ОС и в программе обязательно должен быть курс С/С++ - без них на сегодня делать в системном программировании нечего, ассемблера в программе может и не быть - это не столь важно на самом деле.
    Ответ написан
    Комментировать
  • Как считать из stdin русский текст и вывести его как wchar_t?

    @res2001
    Developer, ex-admin
    blecked88, Было свободное время, провел несколько экспериментов, т.к. про _setmode впервые у тебя увидел.

    Если вместо _O_U16TEXT использовать _O_U8TEXT, то ввод/вывод будет преобразовываться в UTF8, что более привычно (чем UTF16). Особенно это заметно при выводе строк (ввод как раз лучше оставить в UTF16) в файл (например если в консоли сделать перенаправление вывода в файл, а затем файл открыть в текстовом редакторе).

    Вообще, учитывая, что кодировку консоли может устанавливать пользователь самостоятельно, то чтоб было совсем красиво надо перекодировать выводимые строки в кодировку консоли, а не принудительно устанавливать свою кодировку через setmode/SetConsoleCP и т.п..
    Накидал пример, как это может выглядеть:
    Пример
    #define _CRT_SECURE_NO_WARNINGS
    #include <stddef.h>
    #include <stdint.h>
    #include <locale.h>
    #include <wchar.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    #include <io.h>
    #include <fcntl.h>
    #include <Windows.h>
    
    UINT cpo = 0;
    
    void print_wide(const wchar_t* wstr)
    {
      assert(cpo != 0);
      static char buf[512];
      if(WideCharToMultiByte(cpo, 0, wstr, -1, buf, 512, NULL, NULL) != 0)
        printf("multibyte string: \"%s\"\n", buf);
      else
        printf("Error WideCharToMultiByte()\n");
    }
    
    void main()
    {
      cpo = GetConsoleOutputCP();
      _setmode(_fileno(stdin), _O_U16TEXT);
      wchar_t wbuf[512];
      if (wscanf(L"%511ls", wbuf) == 1)
          print_wide(wbuf);
      else
          printf("Error wscanf()\n");
    
    //  const wchar_t *str = L"Привет мир!\u00df\u6c34\U0001f34c";
    //  print_wide(str);
    }

    Схема такая: внутри программы все строки хранятся как wchar_t, литералы с префиксом L. Для консольного ввода принудительно выставляем преобразование в wchar_t с помощью _setmode(U16TEXT) и используем фунции w/wcs. Настройки консольного вывода не меняем, а используем установленные пользователем или системой.
    Для вывода строк:
    1. в начале main узнаем текущую кодовую страницу консоли
    2. в функции print_wide применяем преобразование кодировки с помощью стандартной функции WinAPI.
    Пример взят отсюда. И адаптирован для ввода. Функция преобразования заменена, т.к. функция wcsrtombs из стандартной библиотеки преобразовывает только в UTF8, но не в другие доступные в консоли винды кодировки.
    Таким образом благодаря _setmode и функциям w/wcs ввод автоматически преобразовывается в wchar_t, а вывод "руками" преобразовывается в текущую кодировку консоли.
    В онлайн компиляторах пример гонять бесполезно - не понятно какие кодировки у них там при запуске.
    При компиляции в msvc файл с исходником сохранять в UTF8, добавить ключ компилятора /utf-8 (или можно сохранить файл с BOM).
    Для тестов меняем кодировки консоли руками (chcp 866/1251/65001), перенаправляем вывод в файл и смотрим кодировку текста в файле каким-нибудь доступным редактором (notepad++/far edit/...) - она должна совпадать с кодировкой установленной командой chcp.

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

    Еще немного в тему. Для файлового текстового ввода/вывода можно применять этот же подход, только кодировку входного файла надо устанавливать вручную (параметром командной строки или еще как-то) или анализировать текст файла, есть алгоритмы для автоматического определения кодировки, правда они не всегда могут срабатывать.

    Статьи на тему:
    https://habr.com/ru/companies/xakep/articles/257895/
    https://habr.com/ru/companies/ruvds/articles/645325/
    https://habr.com/ru/articles/731614/
    Полезные ссылки:
    https://learn.microsoft.com/ru-ru/windows/console/...
    https://learn.microsoft.com/ru-ru/windows/win32/in...
    https://learn.microsoft.com/ru-ru/windows/win32/ap...
    https://learn.microsoft.com/ru-ru/cpp/c-runtime-li...
    https://learn.microsoft.com/ru-ru/cpp/c-runtime-li...
    Ответ написан
    Комментировать
  • Возможно ли реализовать TCP на Delphi?

    @res2001
    Developer, ex-admin
    Написал ответ в комментариях тут.
    Ответ написан
    Комментировать
  • Как сделать линковку в проекте на с++ Visual Studio?

    @res2001
    Developer, ex-admin
    Ответ в комментарии
    Ответ написан
    Комментировать
  • Существуют ли эталонно красиво написанные программы?

    @res2001
    Developer, ex-admin
    Код должен решать определенную задачу. Читать абстрактный код без понимания сути решаемой им задачи - бессмысленное занятие. Т.е. вы должны сначала вникнуть в задачу и хотя бы в черне представить как бы вы ее решали. В этом случае, читая код, уже можно оценивать те приемы, которые там применены.
    У меня сложилась такая практика: когда мне требуется использовать библиотеку, в которой реализован нужный мне функционал (т.е. я изначально уже знаю какую задачу должна решать библиотека), я сначала читаю обзорно документацию на нее, потом лезу в исходники и смотрю как оно там все устроено. Некоторые библиотеки после такого анализа отбраковываются, из других можно вынести для себя что-то полезное, но в любом случае начинаешь лучше понимать как работает библиотека.
    На изучение кода толстых библиотек может уйти много времени, поэтому смотрю только какую-то небольшую часть, которая нужна в данном конкретном случае.
    Многие просмотренные мной библиотеки написаны не плохо с моей точки зрения, но на сколько они "эталонно красивы" судить не берусь.
    В целом считаю, что читать чужой код - полезный навык. Но все таки умение программировать самому еще более полезный. Поэтому надо правильно расставить приоритеты.
    Ответ написан
    Комментировать