• Как задать IP адреса и маски в этой сети?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Классика

    Датчики с завода допустим идут с настройкой
    192.168.0.2
    Что вам нужно на роутере настроить
    192.168.0.1 отрубить dhcp задать маршруты до сервера с приложением влажности

    Далее настраиваете есп
    192.168.0.2
    192.168.0.3
    192.168.0.4
    192.168.0.5
    192.168.0.6
    192.168.0.7

    Гэйтвеем указываете 192.168.0.1
    Итого у вас

    Роутер 192.168.0.1 который роутит и вот этот адрес 172.27.1.12
    Датчики 192.168.0.2-192.168.0.7
    И сервер приложений 172.27.1.12

    Впрочем можете раздать сенсорам и их роутеру адреса из сетки 172.27.1.0/24
    Ответ написан
    Комментировать
  • Какие адреса из подсети 172.16.10.0 можно использовать для адресации?

    fzfx
    @fzfx
    18,5 дм
    Можно использовать адреса со 172.16.10.0 по 172.16.10.63. Потому что именно эти адреса входят в подсеть 172.16.10.0/26. Другие адреса в эту подсеть не входят. При наложении маски подсети на адрес подсети будет видно, какие биты адреса подсети относятся к адресу подсети, а какие к адресу хоста в подсети.
    Адрес 172.16.10.0 при этом является адресом самой подсети, адрес 172.16.10.63 - широковещательный адрес подсети, назначать эти два адреса машинам в этой подсети нельзя. Остальные адреса диапазона доступны для назначения машинам в этой подсети.
    Ответ написан
    1 комментарий
  • Как получить HMODULE импортированой dll без LoadLibraryA() или GetModuleHandleA()?

    @wishz Автор вопроса
    РЕШЕНИЕ:

    #include <Windows.h>
    #include <winternl.h>
    #include <cstdio>
    
    using namespace std;
    
    void get_by_peb()
    {
    	// Получаем указатель на PEB
    	// небольшой хак без какого либо импорта, чисто через asm получаем указататель на PEB структуру
    	PPEB peb = NULL;
    #ifdef _WIN64
    	peb = (PPEB)__readgsqword(0x60);
    #else
    	peb = (PPEB)__readfsdword(0x30);
    #endif
    	printf("PEB addr: [%p]\n", peb);
    	PPEB_LDR_DATA ldr = peb->Ldr;
    	PLIST_ENTRY startPos = &ldr->InMemoryOrderModuleList;
    	PLIST_ENTRY currPos = startPos->Flink;
    
    	int moduleCount = 0;
    	while (currPos != startPos) {
    		moduleCount++;
    		currPos = currPos->Flink;
    	}
    	printf("Modules count: [%d]\n", moduleCount);
    
    	currPos = currPos->Flink;
    	PLDR_DATA_TABLE_ENTRY pLdrEntry;
    	for (int i = 0; i < moduleCount; ++i) {
    		pLdrEntry = CONTAINING_RECORD(
    			currPos,
    			LDR_DATA_TABLE_ENTRY,
    			InMemoryOrderLinks);
    		printf(
    			"[%ls], BASE-ADDR: [0x%p], Entry-Point:[0x%p]\n",
    			pLdrEntry->FullDllName.Buffer,
    			pLdrEntry->DllBase,
    			pLdrEntry->Reserved3[0]
    		);
    
    		currPos = currPos->Flink;
    	}
    
    }
    
    int main(void) 
    {
    	
    	// Проверяем адрес
    	HMODULE dll_1 = GetModuleHandleA("KERNEL32.dll");
    
    	printf("--------------------\n");
    	printf("KERNEL32.dll :: [%p]\n", dll_1);
    	printf("main() :: [%p]\n", main);
    	printf("--------------------\n");
    	// Решение:
    	printf("--------------------\n");
    	get_by_peb();
    	printf("--------------------\n");
    
    	return 0;
    }


    62c348dec459d705410876.png

    Большая часть кода (оригинал): https://makestation.net/thread-3057.html
    Ответ написан
    1 комментарий
  • Как из vector с int8_t получить int число?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как получить то же самое в С++?

    например так:
    uint8_t foo[] = {7, 7};
    int i = foo[0] + 256 * foo[1];


    В js я могу получить это так
    Int8Array

    Скажи,
    - а что будет, если элемент массива foo будет иметь отрицательное значение?
    - а что будет, если твой код запустить на архитектуре с порядком байт big-endian?
    Ответ написан
  • Указатели в языке Си?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    почему программа завершилась? Вмешалась ОС? Но если так, то почему?

    Потому что у тебя был неинициализированный указатель, который по стечению обстоятельств указывал в область памяти которую можно читать (мы это знаем, поскольку ты смог оттуда прочитать значение) но нельзя изменять (поскольку ну ты понял).

    Почему я не могу поменять значение самого указателя (ведь указатель - это всего лишь ссылка на адрес памяти, а не на значение).

    Значение указателя ты поменять можешь, но это не то, что было написано в коде. В коде было написано поменять значение на которое указатель указывает. Поменять указатель было бы a = (int *)10;

    могу ли я указателю дать ссылку на конкретную ячейку в памяти?

    Можешь, но под ОС с виртуальной памятью это в большинстве случаев не имеет смысла. API в таких ОС обычно устроены так, что ты просишь выделить область памяти с заданными характеристиками, а ОС выполняет выделение и возвращает тебе адрес выделенного участка.

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

    В памяти всё хранится как последовательность байтов. Любую последовательность байтов можно проинтерпретировать как указатель. Но чтобы компилятор С понял что ты имеешь в виду, ему надо явно сказать, что ты хочешь проинтерпретировать целое число как адрес: int *a = (int *)0x0061FF18;
    Ответ написан
    Комментировать
  • Что означает -'0' на C?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Это вычитание значения '0' из значения str[j]. И то и другое - символы, они же char. В языке Cи, это целочисленный тип. Просто каждому символу дается его ascii код.

    Тут это используется для получения численнного значения цифры из ее символьного значения, ведь символы '0'-'9' в ascii идут подряд в натуральном порядке.
    Ответ написан
    Комментировать
  • Как данные перемещаются в сети интернет, всегда конвертируются в кадры Ethernet или остаются в пакетах IP?

    CityCat4
    @CityCat4 Куратор тега Сетевое администрирование
    Внимание! Изменился адрес почты!
    Олиферы прочитаны?

    Если нет, то тогда вот такая вот история:
    - ты берешь кило картошки и высыпаешь его в пакет, на котором пишешь "кило картошки"
    - потом упаковываешь это в другой пакет, на котором пишешь "квартира 29"
    - потом упаковываешь это в другой пакет, на котором пишешь "3-я ул. Строителей, дом 12"
    - потом упаковываешь это в другой пакет, на котором пишешь "В доставку" и зовешь курьера.

    Курьер приезжает в доставку и снимает свой пакет.
    Доставка видит адрес, довозит пакет до дома, передает его консьержу и снимает свой пакет
    Консьерж зовет коридорного, который подымает пакет к двери квартиры и снимает свой пакет, потом звонит в дверь
    Адресат открывает дверь и видит пакет с надписью "кило картошки".

    Разве картошка по пути следования в что-то "преобразовывалась"?
    Ответ написан
    5 комментариев
  • Можно ли сделать отдельный вывод в Microsoft Visual Studio 2021?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Программист управляет двумя потоками вывода текста. STDOUT и STDERR через функции printf(...) или через расширенную версию с указанием файлового дескриптора вывода fprintf( stderr, ....).

    При запуске в консоли вы можете указывать что например вывод ошибок идет в err.log и стандартный вывод в std.log
    application.exe > std.log 2>err
    (в данном случае двойка - это номер дескриптора STDERR. Есть альтерантивный синтаксис когда для STDOUT
    мы указываем единичку "1>std.log" но ее просто опускают поэтому синтаксис так странно отличается)

    Как поступает с обоими потоками среда - я не помню. Скорее всего она их объединяет. Поэтому запускайте в консоли.

    Это вобщем-то архитектура любого процесса Unix и Windows.
    Ответ написан
    2 комментария
  • Как удобно переключаться между двумя дисками?

    @pfg21
    ex-турист
    1. менять приоритет запуска носителей в менюшке биос.
    2. поставить хороший загрузчик и менять приоритет запуска разделов в нем.
    Ответ написан
    Комментировать
  • Как удобно переключаться между двумя дисками?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Bcdedit вам в помощь. Настройте менюшку на входе по дефолту 10 через 5 сек или пункт меню
    Ответ написан
    Комментировать
  • Как записать значение в файл и зашифровать его на языке C?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Открывайте файл в бинарном режиме "wb" и пишите туда через fwrite (лучше побайтово, чтобы не мучиться с переносимостью из-за порядком байтов в int).

    Читайте, соответственно, через fread.

    Для шифрования лучше всего, во-первых, байты в разном порядке писать, (не 0,1,2,3, а, скажем, 2,0,3,1) и, во-вторых, xor-ить их с какими-то константами. А еще лучше не с константами, а со случайными данными, которые тоже записываются в файл рядом. Или не рядом, так будет закономерность меньше видна.

    Но все это может спасти только от людей незнакомых с reverse engineering'ом и отладкой. Более менее осведомленный ползователь посмотрит в ассемблерный код и поймет, что и как там читается и где и что надо поменять. Но да, это посложнее просто редактирования txt файла.

    Ну и, artmoney с cheat engine никто не отменял.
    Ответ написан
    Комментировать
  • Почему при вызове деструктора не меняется переменная?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Я так понимаю, у вас проблема со строчкой
    aobj1[0] = a(2);

    Тут вызывается конструктор для временного значения a. Потом оператор копирования из временной переменной в *aobj. Потом вызывается деструктор временного значения.

    А потом где-то в конце произойдет и деструктор aobj.

    У aobj delete_counter после этой строчки равен 1 (ведь он скопирован у временного значения, которое сделало delete_counter единицей в констукторе). В конце при вызове деструктора aobj там delete_counter будет 1 в начале.

    Вы смотрите на адрес this в дебагере в деструкторе. Два вызваных деструктора будут для двух разных объектов (для временного значения и для aobj).

    Если вы хотите какой-то счетчик ссылок делать, то вам надо переопределять операторы копирования и перемещения (а так же все возможные конструкторы). И там аккуратно изменять счетчик ссылок. И счетчик ссылок должен быть частью общего объекта - частью класса b, а не класса a.
    Ответ написан
    4 комментария
  • Почему dhpcd сжирает все ресурсы сервера?

    fzfx
    @fzfx
    18,5 дм
    мне неизвестен ни один сервер DHCP с именем .dhpcd. больше похоже на майнер.
    Ответ написан
    2 комментария
  • Почему Git-команда ведёт себя так?

    @qwazimord
    Интроверт
    Эта команда выводит конфиг постранично. Если нажать пробел - появится следующая страница, если q - то команда завершится и снова можно будет вводить команды. Перед нажатием q убедитесь, что раскладка английская, а не русская.
    Ответ написан
    3 комментария
  • Почему простой цикл на c++ выполняется медленнее, чем на golang?

    @deliro
    Да хотя бы потому что оптимизатор может выбросить цикл, посчитав его ненужным. Есть оптимизации, которые умеют цикл заменять прогрессией, а здесь цикл можно вовсе удалить, тк он не влияет ни на что
    Ответ написан
    Комментировать
  • В чём отличие git bash и просто bash?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Git это линуксовый пакет программ, состоящий из множества утилит работающих в текстовом терминале. Когда портировали Git в Windows, пришлось портировать и часть окружения Linux, в том числе и интерпретатор командной строки bash. Git хоть и может выполняться в стандартной командной строке Windows или в Power Shell, но родным для него является bash и лучше работать в нём. Так как это не полноценный bash из линукса, а лишь его виндовая адаптация для Git, то его и назвали Git bash.
    Ответ написан
    Комментировать
  • Какая разница на практике между clang и gcc?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Однажды я на подобный вопрос уже отвечал, правда там вопрос был о кроссплатформенности, а не о трансляторах.

    Какая разница между clang и GCC.
    Разница большая. GCC обладает обширной поддержкой наследия идиом и конструкций из языка C, которые, вынужденно или по своей воле, поддерживает в современном C++.
    VLA, тип по умолчанию, всевозможные изыски синтаксиса C. Это все GCC не глядя принимает за C++ код и позволяет трансляцию.
    GCC даже сегодня многократно нарушает стандарты C++ просто потому что выбрал стратегию поддержки экзотической функциональности C в коде C++. Так же GCC не хвастается и скоростью поддержки стандартов C++.
    В 2016 году Google полностью отказались от поддержки GCC в Android NDK из-за слишком плохой поддержки стандартов и слишком свободного следования стандартам C++. В этот момент GCC стал неконкурентоспособным относительно оставшихся двух самых широко используемых трансляторов.
    Clang же, наоборот, сегодня считается, буквально, бастионом идеального следования стандартам C++. Clang точно поддерживает стандарты во всех деталях, максимально быстро интегрирует изменения и добавления стандартов, позволяет в самых первых рядах поиграться с функциональностью из драфтов следующего стандарта C++.
    Clang обладает обширной системой статической и динамической проверки кода: богатый статический анализ, возможность подключения санитайзеров, поддержка C++ Core Guidelines, очень качественные отчеты об ошибках трансляции, хорошая скорость трансляции.
    Это все ставит clang в предпочтение перед GCC на третьих для GCC платформах.

    О полной совместимости между трансляторами.
    Полная совместимость между трансляторами есть. Иначе я бы не мог делать то, что я делаю. А дело мое заключается в создании полностью кроссплатформенного кода, который однозначно собирается на всех целевых платформах и на всех них выполняется так же однозначно.
    Полная совместимость между трансляторами заключается в строгом соответствии кода выбранному стандарту C++. Всё, точка. На этом к трансляторам требования заканчиваются.
    Только тут есть небольшая проблема. Каждый транслятор по-своему поддерживает стандарт и по-своему реализует неоговоренные стандартом механики. Каждый транслятор имеет свои ошибки трансляции. И вскрывается это все именно в процессе работы над кроссплатформенным кодом.

    Я в своей работе видел многое. Я видел как при смене GCC на clang люди хватались за голову и отказывались от последнего просто потому что он нашел горы нарушений стандарта, которые молча принимал GCC. Я видел как группа из 5 человек 3 месяца рефакторила код при переходе с MSVS2015 на MSVS2017 (т.е. просто при смене версии транслятора) просто потому что разработчики из рук вон плохо знают используемый ими стандарт C++.
    Я видел ошибки в clang, приводящие к неверной генерации кода. Я видел ошибки в GCC, не позволяющие использовать его для кроссплатформенной сборки. Я видел ошибки в MSCL, в результате которых последний явно нарушает стандарт, а команда его разработки отказывается это исправлять потому что "иди нафиг".

    И, тем не менее, конкретно у меня есть возможность писать код ровно один раз и собирать его на 5 совершенно разных целевых платформ совершенно разными трансляторами, на которых этот код работает абсолютно равнозначно. Просто потому что я знаю стандарт и то, как этот стандарт поддерживают выбранные мной трансляторы.
    Ответ написан
    3 комментария
  • Как замерять время выполнения функции?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как замерять время выполнения функции?

    Можно воспользоваться парой clock_gettime / clock_getres.

    как можно искусно замедлить выполнение

    Можно организовать искусный цикл вокруг замеряемой функции и разделить его общее время выполнения на количество итераций. Но детали зависят от того, какое именно время вы там пытаетесь померить. Т.е. если там важны эффекты от кеша, то тупой цикл может быть недостаточно искусным.
    Ответ написан
    Комментировать
  • Как избежать дублирования последней строки из файла?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Вам надо проверять, что вернет fscanf. Если оно у вас вернет что-то меньшее 2, то значит оно не смогло прочитать обе строки. В этом случае надо выходить из цикла и не класть новую запись в таблицу
    Ответ написан
    Комментировать
  • Форматирование смонтированного диска?

    @pfg21
    ex-турист
    ничего не будет.
    ты монтируешь носители не один в другой, а все носители в VFS - виртуальный файловый распределитель это демон, который и разбирается в какой подключенный драйвер файловой системы отправить файловые запросы от пользователя.

    просто обычно есть один носитель, который монтируется как корень "/" но его вполне нормально можно отмонтировать или перемонтировать, ничего не делая с монтированными в /mnt носителями. и т.д.
    они никаким образом меж собой не связаны.
    Ответ написан
    Комментировать