ivan58, Нет. Чтение регистра устройства - это команда контроллеру устройства вернуть состояние своего входа или какие-то параметры конфигурации. В результате в регистр общего назначения процессора записывается результат, возвращенный контроллером устройства, и программист может как-то им манипулировать.
Что при этом делает контроллер устройства не известно - черный ящик. Он может опросить входы или может просто достать результат из внутренней памяти, куда он был ранее записан.
ivan58, Как я уже писал, чтение из регистра - с точки зрения программы это просто чтение памяти по некоторому фиксированному адресу. В регистре всегда есть какое-то значение, его всегда можно прочитать.
Фактически чтение регистра аналогично любому чтению памяти по указателю. То же и про запись.
Значение по умолчанию в регистре зависит от подтягивающих резисторов.
Подаем электрический сигнал на вход , он отображается в регистре (считывается)
Не считывается. Что бы считалось вы должны явно в программе прочитать значение регистра. Только после этого можно считать, что значение регистра прочитано.
Если это выход устройства, то обычно операция чтения соответствующего регистра не имеет смысла.
Если это вход - то операция записи не имеет смысла.
Часто используется один и тот же ригстр и для записи и для чтения. Тогда операция записи - выставляет напряжение на выходе, а операция чтения читает, то что выставлено на входе. Т.е. регистр один, а работает с разными пинами. Подобный подход регулярно встречатся в разных устройствах.
ivan58, Ничего подобного.
Регистры - это программная часть. Программно записать/прочитать регистр - это по сути то же что записать/прочитать некоторое значение по определенному адресу.
Если это выход устройства, то запись в регистр произведет выставление определенного уровня напряжения на конкретном выходе (PINе) устройства. С входами устройства наоборот - передача на вход определенного напряжения выставляет в регистре соответствующее значение. Затем вы программно это значение читаете из регистра.
ivan58, Я сам в схемотехнике не силен. Больше по программной части.
Во входной регистр записывает, конечно, устройство в зависимости от того, что подается на вход.
Если на вход ничего явно не подается, то используется значение по умолчанию, которое зависит от используемого в схеме "подтягивающего" резистора.
Подтягивающий резистор может быть распаян на схеме или в некоторых случаях встроен в чип контроллера. В случае встроенного подтягивающего резистора его можно конфигурировать через свои регистры. Если при этом используется внешний подтягивающий резистор, то он перекрывает действие внутреннего. Многие именно так и делают.
Хорошо бы уточнить применительно к чему ваш вопрос. В какой железке вы пытаетесь читать регистры, какая ОС, какой язык программирования.
В общем случае регистры центрального процессора - это некоторый набор фиксированных блоков быстродействующей памяти с которой процессор может работать на прямую (т.е. совершать операции со значением в регистре). Регистры имеют имена (символические мнемоники в языке ассемблера), их количество и размер ограничены. С остальной памятью процессор не работает непосредственно, что бы можно было что-то сделать со значением, лежащим в ОЗУ, надо это значение прочитать в регистр, совершить над регистром соответствующие операции, сохранить результат в ОЗУ. Обычно доступ к регистрам можно получить только из ассемблера, более высокоуровневые языки на прямую не позволяют работать с регистрами.
Порты устройств для x86 - это некоторые фиксированные адреса в памяти, на которые позиционируются регистры устройства. Записывая и читая порты вы тем самым взаимодействуете с устройством. В АРМах обычно это называется регистрами устройства, там не применяется термин порт, но по существу это то же самое.
Регистры устройств обычно на прямую не связаны с входами/выходами устройства, между ними находится какая-то логика, которая преобразует значение на входе устройства в значение в регистре и наоборот. Кроме того есть конфигурационные регистры, которые напрямую не влияют на входы/выходы, а влияют на логику работы устройства.
hunter0358, Смотрите, когда на компе серый адрес, он не может на прямую адресоваться в интернете. Поэтому где-то этот серый адрес должен подменяться белым адресом. Этот процесс происходит с помощью NATа - Network Address Translation, это служба, которая занимается подменой адресов. Вот с помощью этой службы и настраивается проброс портов. Как правило в домашних роутерах NAT включен по умолчанию, можете посмотреть как там это выглядит. Подробности настройки NAT стоит смотреть в документации к роутеру или к тому ПО, которое используется для этого (если NAT не на роутере, а на компе). Проброс портов - это одна из стандартных возможностей NAT.
Если серый IP вам выдает оператор, то NAT находится у оператора и, конечно, доступа к нему вы не имеете.
и чем vds отличается от vps
Вообще это не вполне устоявшиеся термины. В принципе они означают примерно одно и то же. Различия скрываются под используемой технологией виртуализации. Если это контейнерная технология, то вы ограничены в выборе ОС, которая устанавливается внутрь контейнера, и в этом случае ограничен набор используемого софта. Если это полноценная виртуализация, то внутрь можно поставить практически любую ОС, иметь права администратора в этой ОС и устанавливать любой софт.
Для поднятия OpenVPN обычно достаточно VDS с самым минимальным объемом ресурсов, который может дать оператор VDS. В качестве ОС может быть любой бесплатный линукс без GUI. Конечно, нужно уметь работать с линуксом в командной строке.
Если арендовать VDS с виндой, то ресурсов потребуется больше для самой винды плюс еще придется платить за лицензию на винду.
Забыл про еще один вариант - гуглите "free openvpn". По этому запросу найдете несколько сервисов, которые бесплатно предоставляют услуги ВПН сервера. Поскольку это бесплатно, то никто никакой гарантии производительности не дает, и даже не гарантирует, что завтра этот сервер будет доступен. Если вам это подходит, то останется только скачать готовый конфиг и подсунуть его вашему OpenVPN клиенту.
hunter0358, Public IP - да это тот IP с которого комп попадает в интернет.
Но этот Public IP не обязательно должен быть присвоен сетевому интерфейсу компьютера. Чаще всего Public IP находится на роутере. В этом случае вы должны в настройках NAT пробросить порт, используемый OpenVPN с роутера на комп. Если роутером вы не управляете, то остается возможность договорится с тем, кто управляет роутером о пробросе прота. Если договорится не возможно - надо искать обходные варианты. Обходной вариант я описал в ответе. Кстати, вы можете взять VDS бесплатно на тест на какое-то время, многие хостеры VDS дают такую возможность, настроить там OpenVPN и проверить работоспособность ВПН, а потом уже принимать решение об аренде.
Если это не связано с серым айпи клиента, то как можно решить вопрос?
Серый IP на клиенте - никак на процесс не влияет. Важен белый IP на сервере. На клиенте при этом может быть любой IP, лишь бы он имел выход в интернет. Решение я вам написал в своем ответе.
чьим фаерволом?
Любым. Хоть на фаером на конечных узлах (клиенте или сервере), хоть любым промежуточным фаерволом.
Владимир Юрченков, Это не безопасность. Это гарантия доставки пакетов. Да эту гарантию обеспечивает TCP и не обсепечивает UDP. Но в данном случае это не важно, т.к. эту гарантию дает протокол OpenVPN, и она таки есть при использовании OpenVPN поверх UDP.
Ваша еда может доехать до вас в целой упаковке, но от нее откусят по дороге кусок или плюнут туда по дороге - вот это больше похоже на безопасность (точнее на не безопасность), если уж проводить аналогии.
Я это понял. Поэтому и пишу вам про внешний VDS с белым IP.
Без белого внешнего IP адреса OpenVPN не будет работать. Или вы должны иметь возможность настроить проброс порта, используемого OpenVPN с сервера NAT на сервер OpenVPN.
Это, кстати, не ограничение OpenVPN - серые адреса не могут маршрутизироваться в интернете и подобные пакеты, если они попадут в интернет, тут же будут убиты первым же промежуточным шлюзом.
hunter0358, Ошибка с таймаутом, чаще всего говорит о том, что нет связи с удаленным сервисом.
Связи может не быть по разным причинам, в т.ч. и при блокировки трафика фаерволом.
Чем же, интерено, TCP безопаснее UDP? Тем что гарантирует доставку пакетов? Но это к безопасности не имеет отношения. Доставку пакетов поверх UDP гарантирует собственный протокол OpenVPN.
Предварительно я бы вынес из hpp куда-нибудь в другое место объявления не касающиеся внешнего пользователя библиотеки, т.е. то что используется только внутри библиотеки и не должно использоваться (быть видимо) внешнему пользователю. Это может привести к увеличению количества заголовочных файлов.
С другой стороны можно пойти от обратного - разместить в "пользовательском" hpp все что надо внешнему пользователю, а во "внутренних" hpp включать этот "пользовательский" hpp, если это необходимо.