Задать вопрос
  • Как OpenVPN сочетает redirect-gateway и push?

    @res2001
    776166,
    это понятно, не понятно остальное

    Что понятно? Вы, возможно, не правильно написали опцию. Я указал правильное написание и дал ссылку на мануал с описанием ее применения.
    Остальное будет работать. Маршрут по умолчанию применяется всегда когда не находится других более специализированных маршрутов. И это не специфика ВПН или openvpn - так работает маршрутизация в TCP/IP.

    Вообще вы можете прямо на локальной машине задать фиксированные маршруты, если вас такой вариант устраивает.
    Опции route/iroute и push route аналогично добавляют маршруты, разница только в том где они добавляют их - push route добавляет маршрут на ВПН клиенте, route/iroute - на ВПН сервере.
  • Как OpenVPN сочетает redirect-gateway и push?

    @res2001
    776166,
    но я тоже хочу их пушить с персональных настроек.

    Пожалуйста. Тот же самый push будет работать и в файле конфигурации пользователя. Для сетей за клиентом надо использовать iroute, вместо route.
  • Как исправить ошибку "Кадр не находится в модуле" при создании потока?

    @res2001
    Кода я и не заметил :-)
    Я писал выше про использование глобальных переменных. Вариант имеет право на существование, но когда у тебя будет проект побольше и с несколькими потоками глобальные переменные вообще не вариант, как правило.
    Вообще исопльзоавние глобальных переменных в принципе не очень хорошая идея, а не только для потоков.
    В некоторых случаях это допустимо, но таких случаев не много.
    И если уж ты хочешь научиться работать с потоками, то важно научиться и правильно передавать в поток параметры и принимать возвращаемое значение. И параметров и возвращаемых значений может быть не одно.
    И это я еще не начинал говорить о совместном использовании данных разными потоками - это вообще отдельная огромная тема.

    Обрати внимание, что твоя потоковая функция по сигнатуре не соответствует документации. Она должна быть такой: https://docs.microsoft.com/en-us/previous-versions...
    Твой код в принципе рабочий, но стоит добавить опций компилятору, как он начнет ругаться на эту ошибку, по формальным признакам.
    И еще - потоковая функция возвращает значение типа DWORD, в твоем случае можешь передавать возвращаемое значение потока через него, не используя глобальную переменную.
    В POSIX потоковые функции возвращают указатель void*
  • Как исправить ошибку "Кадр не находится в модуле" при создании потока?

    @res2001
    Nulltiton,
    передо мной стоит задача изучить именно CreateThread

    Изучай конечно. Просто работа с потоками она +-одинакова везде, т.к. поток - совершенно определенная сущность ОС, одинаковая для всех ОС. POSIX вариант потоков считаю наиболее продуманным и простым, а вариант стандартной библиотеки по сути копирует POSIX. Внутренняя реализация потоков в ядре ОС, конечно, разная для разных ОС, но это не должно волновать прикладного программиста.
    никак не могу понять, как будет выглядеть конструкция для, вот допустим, вывода на экран возвращаемого значения функции?

    Выкладывай код, который у тебя получился и вопросы по нему. Дальше в слепую уже трудно что-то советовать.
  • Как исправить ошибку "Кадр не находится в модуле" при создании потока?

    @res2001
    Nulltiton, Я тут нахваливаю потоки стандартной библиотеки, но вы должны понимать, что все более высокоуровневые реализации используют реализацию потоков предоставляемую операционной системой, поэтому внутри того же thrd_create() из стандартной библиотеки спрятан вызов CreateThread в винде или pthread_create() в POSIX совместимых ОС. Никаких других потоков (так же как и процессов), кроме предоставляемых ОС быть не может.
  • Как исправить ошибку "Кадр не находится в модуле" при создании потока?

    @res2001
    Nulltiton, (int *)gn
    Это не ссылка на параметр. Если gn целое, то вы просто меняете тип данных из целого в указатель, при этом само значение не меняется.
    Соответственно в потоковой функции вы должны сделать (int)arg для получения из указателя снова целого числа.
    В таком случае вы никак не можете вернуть из потока значение, разве что используя глобальные переменные, но это плохой вариант (для средних и крупных проектов).

    Если у вас возврат из потоковой функции имеет тот же тип, что и параметр, то можете передавать именно указатель на gn: &gn и через этот же указатель возвращать значение.
    Если же тип возвращаемого значения другой, то лучше всего объявить структуру, содержащую и параметр и возвращаемое значение и передавать указатель на структуру. А кроме того это самый наглядный и простоя для понимания вариант.
    Кстати, в реализации потоков стандартной библиотеки предусмотрен вариант возврата значения из потока в виде целого числа: https://en.cppreference.com/w/c/thread/thrd_join
  • Как исправить ошибку "Кадр не находится в модуле" при создании потока?

    @res2001
    Nulltiton,
    как теперь передать параметр?

    Четвертый параметр CreateThread предназначен для этого. И почитайте наконец MSDN: https://docs.microsoft.com/en-us/windows/win32/api...
    Обычно все необходимые параметры для потока собирают в структуру и передают указатель на структуру. Если у вас только целое число в качестве параметра, то можете конвертировать это целое в указатель и таким образом передать. В потоковой функции надо будет сделать обратное преобразование параметра.
    И надо подумать о том, как будете возвращать значение. Можно возвращать в той же структуре, которую передаете в праметре. Но сначала надо дождаться завершения потока!
    Вообще рекомендовал бы для потоков использовать функции стандартной библиотеки - потоки завезли в С11. Там синтаксис приближен к POSIX, он более прост и понятен, чем стандартные функции WinAPI. Кроме того, этим вы делаете код более платформонезависимым.
  • Как исправить ошибку "Кадр не находится в модуле" при создании потока?

    @res2001
    Дмитрий, Не так давно появилась книжка "Экстремальный Си". Ничего особо экстремального нет, но материал там уровнем по выше, чем в обычных учебниках. Хоть в книге есть и ошибки/опечатки, но в целом рекомендую.
    На счет учебников - сгодится люой для начала. Си язык простой и не большой. Дополнительную информацию ищите тут и в гугле то же всего полно.
    Есть несколько тем, обычно плохо понимаемых начинающими: указатели и адресная арифметика, работа с динамической памятью. На них надо обратить особое внимание.
  • Как реализовать строковой тип данных в Си?

    @res2001
    voproser45654, Текстуры складывайте в байтовые массивы uint8_t, например.
  • Как реализовать строковой тип данных в Си?

    @res2001
    voproser45654, Любому программисту на Си запись char x[] = "ddd" или char *x = "ddd" одинаково привычна и читабельна. А вот если вы начнете это заменять на самопальный string, то читающему сначала придется выяснить что это за тип и как с ним работать. Вот он будет удивлен, когда узнает, что это псевдоним для Сишных строк, оканчивающихся нулем.
    Обычно, когда вводится дополнительный тип, то к нему нужен и некоторый API для работы с типом. У вас же предполагается использовать API стандартной библиотеки, видимо. Программисту, читающему код, каждый раз когда он встретит подобный вызов с параметром типа string, придется вспоминать что это тот же самый char*.
    Короче, на мой взгляд, эта замена не добавляет читаемости коду.
  • Как реализовать строковой тип данных в Си?

    @res2001
    Какой смысл в подобной замене? Только то что вместо char будете писать string? Но все операции остаются прежними - это не будет строковым типом данных.

    Если хотите строки подобные плюсовым, то нужно объявлять структуру с хранением указателя на выделенную под строку память и возможно длиной текущей сохраненной строки и длиной текущего буфера. К структуре дописать пачку функций, реализующий работу с вашей строкой. За пример интерфейса можно взять тот же std::string из плюсов.
  • Как windows получает настройки proxy?

    @res2001
    LAG_LAGbI4, Вы можете пойти "от противного" - сделайте pac скрипт, в котором отменяйте использование прокси, разместите его раздачу в DHCP (скрипт можно положить на какой-то общедоступный сетевой ресурс, а в DHCP опциях задать путь к нему), как сказано в статье.
  • Как работает дизассемблирование в С++?

    @res2001
    Stalker_RED, Тема написания первого ассемблера по ссылке не раскрыта, я считаю :)
    Собственно, вопрос риторический.
  • Как работает дизассемблирование в С++?

    @res2001
    Василий Банников,
    Так никогда не писали. ...
    Когда появились нормальные терминалы - стали писать на ассемблере

    Как же написали первый ассемблер? :-)
  • Инструменты для визуализации mongodb?

    @res2001
    На сколько помню, в монге можно задать некоторые правила проверки при заполнении контейнеров, некий аналог схемы в реляционных БД. Если эти правила есть, то теоретически можно что-то построить, основываясь на этих правилах, если нет - каждая запись может быть произвольным объектом.
  • Ubuntu. Какой сервис или процесс пишет данные строки в syslog?

    @res2001
    Константин, На сколько я понимаю эти сообщения появляются при загрузке ОС. Видимо systemd сообщает об этапах загрузки системы. Это не ошибки, а просто информационные сообщения.
  • Ubuntu. Какой сервис или процесс пишет данные строки в syslog?

    @res2001
    Константин, В данном случае это пишет именно systemd. Если что это не "только программа" - как вы можете увидеть местами у systemd PID == 1.
    systemd - этот тот самый первый демон, который стартует самым первым сразу после ядра и управляет всей системой. И он то же может писать логи.
  • Ubuntu. Какой сервис или процесс пишет данные строки в syslog?

    @res2001
    Видимо это systemd.
    В логах, как правило, указывается имя сервиса, который записал это конкретное сообщение, в скобках указан PID.
  • Как сделать проброс по порту для другой сети?

    @res2001
    m4son,
    Я думал создать порт от сети vpn

    Вы не правильно думаете.
    На сколько я понял виртуальная машина имеет доступ к вашей локальной сети.
    Тогда вам достаточно в настройках openvpn сервера добавить маршрут для своей локальной сети, который будет добавляться при подключении на стороне клиента. Делается это с помощью опции в конфиге ВПН сервера:
    push "route <IP адрес локальной подсети> <маска подсети>"

    Если у вас локальная сеть за ВПН сервером имеет адрес 192.168.1.0 и маску 255.255.255.0, то опция будет выглядеть так:
    push "route 192.168.1.0 255.255.255.0"
    Кавычки являются частью опции.
    После добавления опции в конфиг сервера, перезапустите сервер, подключитесь клиентом. На стороне клиента должен появится маршрут к подсети за сервером. Проверить это можно командой route print.
    Но это еще не все - на вашей виртуалке вы должны добавить маршрут до ВПН подсети, иначе все ответы будут отправлятся на шлюз по умолчанию (это скорее всего ваш домашний роутер), а это не то что надо. Добавить маршрут можно командой: route add. В команде шлюзом указать IP адрес в локальной сети вашего реального компьютера.

    Чтоб вся эта конструкция не слетела после смены адреса компа (он же скорее всего получает адрес динамически), нужно как-то зафиксировать адрес на компе, чтоб он не менялся со временем. Это можно сделать двумя способами: 1. Указать статический адрес не из диапазона, раздаваемого DHCP сервером. 2. Настроить DHCP сервер, чтоб он МАС адресу вашего компа всегда отдавал какой-то определенный IP адрес.