IvanOne, Проверьте права на ключи и сертификаты. Права на закрытые ключи должны быть ТОЛЬКО у владельца, владельцем должен быть пользователь из-под которого вы запускаете openvpn. На сертификаты можно дать всем на чтение. В конфиге лучше указывать полные пути к ключам.
Работают.
На каком коде? Для "Hello world" бесполезно включать оптимизацию.
Надо использовать либо -O2 либо -O3. Если указаны оба вместе, то будет использован последний.
Добавьте указатель на родителя в узел дерева. И перепешите все с учетом этого - избавьтесь от вашего стека (STACK) и рекурсии везде.
Никто в здравом уме в реальных приложениях не выделяет дополнительную память просто для того что бы обойти дерево (не важно для каких целей). У вас же это необходимость, просто из-за того, что имея указатель на текущий узел дерева вы не можете вернуться к родителю. И вы вынуждены использовать либо "динамический" стек (STACK), либо рекурсию.
Добавление указателя на родителя решает эту проблему.
Напомню, что рекурсия - это то же использование дополнительной памяти, она ограничена размером стека (не вашего "динамического" стека, а "аппаратного"). Так что ее лучше не применять в реальных приложениях, т.к. может вызвать переполнение стека.
Напомню, что выделение динамической памяти операция очень "дорогая" (затратная в плане процессорного времени). Выделение стековой памяти (аппаратного стека (рекурсия), а не STACK), операция "дешевая", но размер стека ограничен и он не большой.
Много букв, не осилил.
Для нормального обхода дерева в глубину, без использования дополнительной памяти, заведите в узле еще один указатель - на родительский узел. Думаю это значительно упростит все ваши алгоритмы.
В Distance() утечка памяти - вы выделяете память и теряете указатель при выходе? Явно malloc тут не нужен.
Для удаления узла потребуется некоторая перестройка нижележащего поддерева. Просто проделайте это на бумаге, станет яснее.
У вас в DeleteNode вообще сложно что-то понять. В DeleteSomeNodes() выделяете неинициализированную память и тут же читаете значение в ней. И делаете на этом основании какие-то выводы. Что это? Датчик случайных чисел?
genibeni, Согласен, блокировать фаерволом крупные домены типа youtube довольно утомительно.
В интернете есть сервисы whois - там вы можете узнать для любого публичного домена его диапазоны адресов.
Для мелких доменов вариант с фаерволом вполне рабочий, а кроме того, наверное, самый простой и не требует дополнительного ПО.
Другой вариант - использовать прозрачный прокси.
В общем альтернативы есть. Выбор зависит от ваших хотелок и возможностей. Возможно, стоит начать с того чтоб определить для себя чего вы хотите от ВПНа. Возможно вам просто не стоит ВПН клиентов выпускать в интернет через ВПН сервер.
Дополню немного.
Если ВПН сервер прописывается на клиенте шлюзом по умолчанию, то весь трафик будет проходить через ВПН сервер и там можно с ним делать все что угодно.
Описанный вариант - всего лишь один из возможных.
Проще всего блокировать определенный трафик на фаерволе ВПН сервера.
Но как и в ответе - клиент может со своей стороны сам изменить шлюз по умолчанию (например вернуть тот, что был до подключения), или добавить маршруты до нужных сервисов в обход ВПН.
jcmvbkbc, Спасибо за подсказку. Все время этот момент улетучивается из головы :)
Значит первоначальный вариант запуска компилятора у автора правильный.
Gradusnik11, Попробуйте изменить порядок следования аргументов в командной строке компилятора - укажите main.c самым последним, после всех библиотек.
Порядок аргументов, передаваемых линковщику имеет значение.
Gradusnik11, Символа должны быть все иначе зависимости останутся не разрешенными и ваш main.c не соберется.
Причем символа должны быть явно определены в libraylib.a. objdump может показывать и символы, которых нет в файле, но на которые есть ссылки (т.е. внешние зависимости). Надо смотреть описание флагов вывода таблицы символов.
Если каких-то символов нет, то видимо, вы как-то не так собрали библиотеку и в нее не вошли какие-то части. Нужно разбираться со сборкой.
Попробуйте nm -gC libraylib.a
nm делает то же самое, что и objdump, но у нее вывод вроде бы по понятней.
В выводе nm функции определенные в библиотеке имеют флаг T, внешние зависимости имеют флаг U.
Ваши функции (из текста ошибок) все должны быть с флагом Т.
Gradusnik11, Вам не нужен код читать.
Вам нужно получить список символов (функций) и просто найти (или не найти) в этом списке функции, перечисленные в ошибках. Вот тут описано как использовать для этих целей objdump. https://stackoverflow.com/questions/34732/how-do-i...
nm то же подойдет.
greensid, Что-то у вас путаница в показаниях :)
В push route адрес 10.200, а пингуете 10.90.
На сколько я могу судить, если бы это правило работало, то оно бы вообще весь входящий транзитный трафик с 10.8.0.10 на tun0 прибивало. Не зависимо от того как у клиента настроена таблица маршрутизации.
Как-то это все не стыкуется.
Возможно надо использовать не FORWARD, а PREROUTING или POSTROUTING.
Как вы это узнали?
У вас же клиенты теперь на эти сети не передают пакеты в ВПН. Они теряются где-то там на стороне клиента, уходя на его шлюз по умолчанию.
Чтоб понять, что "начал отрабатывать", надо добавить на клиент маршрут на не маршрутизируемую сеть вручную (только для теста) и проверить.
Так что думаю iptables у вас не починился, скорее всего. Пробуйте другие варианты с правилами, т.к. по уму все таки блочить на этом уровне, не надеясь на маршрутизацию.
Нет. Это конструкция к Си не имеет отношения.
Я имел ввиду, что если у вас есть программа, которая работает с вводом с клавиатуры, то заставить ее обработать текстовый файл можно запустив ее в консоли вот таким образом: prog.exe <file.txt
где prog.exe - это название вашей программы (или полный путь к ней), а file.txt - это путь к файлу в котором хранятся данные.
В текстовом файле каждое отдельное вводимое поле должно начинаться с новой строки.
Эта конструкция в шеле называется перенаправление стандартного ввода.
А затем я описал другой вариант - с подменой дескрипторов файлов. В этом варианте можно использовать один и тот же код для чтения данных и формирования связного списка, который будет получать дескриптор файла с которым он работает в параметре.
как удалить элемент с наименьшим кол-вом разных букв(то есть последний во втором списке)?
У вас проблемы с удалением элемента из односвязного списка?
Вы уже написали функцию очистки списка.
Удаление одного элемента происходит похожим образом - надо в next предыдущего элемента записать next удаляемого
prev->next = cur->next;
free(cur);
Проблема за малым - по текущему элементу найти предыдущий.
Можно убрать из конфига сервера: push "redirect-gateway def1"
В ccd файле клиентов добавить директивы
push "route ..."
для каждой сети в которую должен попадать клиент.
Это, конечно, не гарантирует, что клиент не добавит маршруты руками, но хоть что-то.
К сожалению не силен в iptables.
S0z1n, Если окно просто больше экрана, то лови лайфхак:
1. Жмешь Alt+Space - появляется системное меню окна
2. Выбираешь там Move (переместить)
3. перемещаешь окно так что бы кнопки внизу были видны
4. Enter
5. Жмешь Открыть
Все действия можно производить на клавиатуре, без участия мыши.
И еще, в комплекте putty есть консольный вариант утилиты, plink называется утилита, если я правильно помню.
Что у вас указано в "Maximum server memory"?