Александр Маджугин, К сожалению не силен в iptables, не подскажу как тут правильно поднять NAT.
Но причем тут "внешний адрес сервера VPS"?
Вы должны поднять NAT на интерфейсе foritvps, а там какой-то свой адрес используемый внутри fortivpn.
Александр Маджугин, Раз без openvpn ваш VPS ходит к gitlab успешно, то как минимум нужный маршрут прописан.
Но этого мало. Т.к. сеть за fortivps сервером ничего не знает о ваших адресах, то ответы будут где-то теряться. Вам нужно настроить NAT на интерфейсе fortivps, тогда в сеть gitlab вы будете попадать с адресом, полученным при подключении к fortivps.
Когда вы ходите к gitlab без openvpn, то используется адрес интерфейса fortivps. Благодаря NAT можно получить тот же эффект и для удаленных компьютеров.
И в конце надо добавить маршрут на вашем компе к сети gitlab через openvpn сервер. Это делается опцией push route в конфиге openvpn сервера.
Приведите схему сети, с указанием внутренних IP адресов, белые адреса можете как-нибудь "переименовать". И кратким описанием того что каждый узел должен делать. Схему можете хоть на бумажке от руки нарисовать и сфотографировать, главное чтоб понятно было.
Вы тут требуете конкретики, какие маршруты прописывать. А сами никакой конкретики не даете. Распечатка ifconfig для одного какого-то хоста малоинформативна.
Дополнительно можно привести конфиг openvpn сервера.
Как все тут писали эта dll не часть MSVS, это часть микрософтовской реализации языков С/С++. Это libc.so и libstdc++.so если проводить аналогии с линуксом, в них содержатся, например реализации cin/cout и printf и вся стандартная библиотека.
Программу с библиотеками можно линковать динамически (как сейчас), или статически. У каждого варианта есть плюсы и минусы. Вариант линковки задается опциями компилятора. При динамической линковке ты сам должен позаботится о том, что бы на компе, где будет исполняться твоя программа были все необходимые библиотеки. При статической линковке библиотеки содержатся в самом исполняемом файле, при этом твой "хело ворд" будет размером в несколько мегабайт.
Микрософт свой рантайм распространяет в виде отдельного установщика, где-то в недрах MSVS должен лежать этот установщик или его можно скачать с сайта микрософт.
Практически любой софт, снимающий образ с диска умеет писать этот образ на сетевые диски.
Сетевым диском может выступать, например, диск на винде куда вы будете впоследствии устанавливать этот образ. Но в этом случае это должен быть второй диск, т.к. первый будет использован при записи образа.
Yrgaaa, Оперативка перезагрузиться не может сама по себе, только вместе со всем компом.
Хорошо бы увидеть батник.
Если он "бесконечно создавал текстовые файлы" - мог забиться диск. Винда вполне может вести себя неадекватно, если места на загрузочном диске нет.
Можно попробовать загрузиться с загрузочной флешки и посмотреть что там батник сделал с диском.
Или если винда хоть как-то загружается, попробовать запустить cmd.exe и из консоли командами исследовать диск, там же можно и удалить весь созданный батником хлам.
Qubc, Я бы даже сказал - важно всегда проверять возвращаемые значения системных функций (и библиотечных). Исключениями тут могут быть разве что функции типа close, т.к. обычно все равно сделать ничего нельзя и не нужно.
Я так понимаю, что при r+ и пустом файле хоть ошибка в errno выставляется, но файл все равно открыт (pFile != NULL)?
Qubc, Не то. Буквально errno = 0;
Когда pFile уже закрыт, то вызывать для него clearerr - вообще смысла нет - он вернет ошибку. И clearerr сбрасывает флаги ошибок файла, а не errno.
kriptonus, Т.е. вам нужно адаптировать библиотеку под железо. Обычно в таких случаях в библиотеках выделяют уровень абстракции железа (HAL или OSAL обычно называется). Часто он идет как отдельная низкоуровневая библиотека в зависимостях основной библиотеки. Как правило это достаточно не большой API, который надо реализовать и который будет использовать библиотека верхнего уровня. Часто можно взять уже готовые похожие реализации и адаптировать их под себя.
Не знаю, есть ли в libmodbus свой HAL или получится с CTS. На сколько знаю, CTS часто используют для целей управления потоком приема/передачи в полудуплексном RS485.
переключать преобразователь в режим приема/передачи
Преобразователь это же ведомое устройство в modbus? А ваша программа, видимо выступает как контроллер?
Тогда вы должны с помощью библиотеки отправить на ведомое устройство некий пакет с конфигурацией. Я не в курсе, как там это в modbus конкретно работает, не имел с ним дела.
Универсальная библиотека в принципе не может обеспечить работу со всей массой устройств, поддерживающих modbus. Библиотека, видимо, реализует только низкоуровневый протокол обмена, который описан в каком-то стандарте. А верхний уровень вы должны реализовать в вашем приложении. Для этого не нужно изменять библиотеку.
Начните с изучения примеров к библиотеке (скачайте исходники, там есть тесты, их можно использовать в качестве примеров работы с библиотекой. Дальше - документация к библиотеке. Если захотите понять глубже, смотрите документацию на modbus.
Наименования столбцов роли не играет.
Играет роль структура. Она должна быть одинаковая, т.е. одни и те же данные должны находится в одних и тех же местах в разных таблицах. Если это список (таблица), то он должен начинаться в определенном месте и колонки должны быть в строго заданном порядке.
Если структуру не привести к одному виду, то придется писать для каждого варианта размещения свою загрузку и т.п.
Или же должен быть некий формализованный алгоритм (который можно запрограммировать) по которому можно найти интересующие вас данные в каждой из этих тысяч таблиц.
Ексел поддерживает встроенные скрипты на VBA, так что поиск по другим таблицам можно реализовать скриптом.
Или настроить связи с другими таблицами. Но связи придется, видимо, делать вручную, а это несколько тысяч связей ...
Qubc, Кстати, есть еще одно отличие - в возвращаемых значениях.
В версии MSVC при Ctrl-Z fscanf возвращает 0, а в gcc - -1.
Ctrl-Z - это не настоящий EOF, в интернетах называют его "мягкий EOF".
И он не вызывает закрытие потока, как должно быть при настоящем EOF, после которого любое последующее чтение должно вызывать ошибку.
Вы какой gcc использовали? Дело ведь происходит под виндой.
Я потестил на mingw-w64, поведение такое же как вы описываете.
Но mingw использует стандартную библиотеку от MSVC. Так что есть вероятность, что в обоих случаях виновата микрософт :) Видимо просто разные версии стандартной библиотеки.
Посмотрел по зависимостям исполняемого файла. В версии от gcc похоже используется fscanf из msvcrt.dll, а в версии от msvc эта библиотека не используется, похоже там вместо fscanf вызывается что-то другое, т.к. символа fscanf я в зависимостях не обнаружил. Но может быть просто плохо искал :)
Ctrl-Z не вызывает закрытие потока.
Ctrl-Z - это обычный символ с кодом 26, просто обрабатывается специфически, обработка, видимо, зашита в стандартной библиотеке.
Детали реализации :)
Не уверен, что поведение как-то стандартизовано.
В линуксе, например, совсем другое поведение в терминале на Ctrl-Z - процесс уходит в спячку.
Ну да, точно! Вы нашли ошибку.
У вас же указатель приводится к типу интерфейса, а указатель на интерфейс не обязан совпадать по значению с указателем на реальный объект.
Удаляйте items не внутри UseContainer, а там же где его создаете. При выделении памяти сохраняйте оригинальный указатель (на объект, а не на интерфейс) и его используйте в delete.
Или смотрите ответ maaGames
metalexs, taskkill вполне рабочий вариант. Но фиг знает как там фильтровать по WINDOWTITLE, состоящему из нескольких слов и т.п.
Но можно делать по другому, фильтровать в tasklist по IMAGENAME (название исполняемого файла) с ключом /v (будет выводить и WINDOWTITLE), а затем в конвеере навешивать фильтр с помощью findstr:
Но причем тут "внешний адрес сервера VPS"?
Вы должны поднять NAT на интерфейсе foritvps, а там какой-то свой адрес используемый внутри fortivpn.