Я не буду открывать подключение к private_IP (только public_IP) в клиенте windows [duplicate]

Хотя переменные, определенные внутри области функции, не могут быть доступны извне, это не означает, что вы не можете использовать их значения после завершения этой функции. PHP имеет хорошо известное ключевое слово static, которое широко используется в объектно-ориентированном PHP для определения статических методов и свойств, но следует иметь в виду, что static также может использоваться внутри функций для определения статических переменных.

Что это за «статическая переменная»?

Статическая переменная отличается от обычной переменной, определенной в области функции, в случае, если она не потеряет значение, когда выполнение программы выходит из этой области. Давайте рассмотрим следующий пример использования статических переменных:

function countSheep($num) {
 static $counter = 0;
 $counter += $num;
 echo "$counter sheep jumped over fence";
}

countSheep(1);
countSheep(2);
countSheep(3);

Результат:

1 sheep jumped over fence
3 sheep jumped over fence
6 sheep jumped over fence

Если бы мы определили $counter без static, то каждый раз эхо-значение будет будет таким же, как параметр $num, переданный функции. Использование static позволяет построить этот простой счетчик без дополнительного обхода.

Использование прецедентов статических переменных

  1. Чтобы сохранить значения между последовательными вызовами функции.
  2. Сохранять значения между рекурсивными вызовами, когда нет пути (или нет цели) для передачи их в качестве параметров.
  3. К кеш-значению, которое обычно лучше извлекать один раз. Например, результат чтения неизменяемого файла на сервере.

Трюки

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

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

function countSheep($num) {
  static $counter = 0;
  $counter += sqrt($num);//imagine we need to take root of our sheep each time
  echo "$counter sheep jumped over fence";
}

Результат:

2 sheep jumped over fence
5 sheep jumped over fence
9 sheep jumped over fence

Статическая функция «разделена» между методами объектов тот же класс. Это легко понять, просмотрев следующий пример:

class SomeClass {
  public function foo() {
    static $x = 0;
    echo ++$x;
  }
}

$object1 = new SomeClass;
$object2 = new SomeClass;

$object1->foo(); // 1
$object2->foo(); // 2 oops, $object2 uses the same static $x as $object1
$object1->foo(); // 3 now $object1 increments $x
$object2->foo(); // 4 and now his twin brother

Это работает только с объектами того же класса.

Является ли статическая переменная единственным способом сохранить значения между вызовами функции?

Другим способом сохранения значений между вызовами функций является использование замыканий. Закрытие было введено в PHP 5.3. В двух словах они позволяют ограничить доступ к некоторому набору переменных внутри области функций другой анонимной функцией, которая будет единственным способом доступа к ним. Быть в закрывающих переменных могут имитировать (более или менее успешно) концепции ООП, такие как «константы класса» (если они были переданы в закрытии по значению) или «частные свойства» (если они переданы по ссылке) в структурированном программировании.

Последний фактически позволяет использовать замыкания вместо статических переменных. Что нужно использовать, разработчик всегда должен решить, но следует упомянуть, что статические переменные, безусловно, полезны при работе с рекурсиями и заслуживают того, чтобы их заметили разработчики.

20
задан Nur Pinar 18 February 2015 в 18:46
поделиться

3 ответа

Вы используете активный режим FTP для подключения к серверу с Pure-FTPd. В активном режиме сервер должен подключиться к клиенту, чтобы открыть соединение для передачи данных (для передачи файлов или списка каталогов). Для этого клиент отправляет свой IP-адрес на FTP-сервер в команде PORT.

Если FTP-сервер находится за пределами частной сети GCE, он, очевидно, не может подключиться к клиентской машине, поскольку машина находится за брандмауэром и NAT.

И на самом деле Pure-FTPd явно проверяет, соответствует ли IP-адрес в команде PORT IP-адрес клиента соединения FTP-управления. Он не будет соответствовать, если клиент отправит свой внутренний IP-адрес в сети GCE. Если этот случай, сервер Pure-FTPd отклоняет передачу напрямую (даже не пытается подключиться) к сообщению об ошибке, вы получаете:

Я не буду открывать соединение с ... (только для ...)

(где первый ... - это IP-адрес, предоставленный клиентом в команде PORT [локальный адрес в закрытом GCE сеть), а второй ... является внешним [NATed] IP-адресом клиента, как известно серверу.)


Даже если клиент сообщил о внешнем [ NATed] в команде PORT, он все равно не будет работать, поскольку попытка подключения не пройдет мимо NAT и брандмауэра.

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

См. (Моя статья) Режимы FTP-подключения для получения подробной информации о режимах.

Итак, переключитесь на пассивный Режим. Как это делается, зависит от клиента.

  • В большинстве обычных * nix ftp клиентов командной строки используйте переключатель командной строки -p, хотя по умолчанию используется пассивный режим В любом случае: -p Используйте пассивный режим для передачи данных. Позволяет использовать ftp в средах, где брандмауэр предотвращает подключение внешнего мира к клиентской машине. Требуется, чтобы сервер ftp поддерживал команду PASV. Это значение по умолчанию для всех клиентов (ftp и pftp) из-за проблем с безопасностью, использующих режим передачи PORT. Флаг поддерживается только для совместимости и больше не действует.
  • Некоторые клиенты также поддерживают команду passive.
46
ответ дан Martin Prikryl 21 August 2018 в 06:00
поделиться
  • 1
    Это тоже моя проблема; по-видимому, не все клиенты ftp Linux используют по умолчанию пассивный режим. – Mr Lister 9 June 2015 в 18:52
  • 2
    просто для добавления, команда ftp -p SERVER – arun 14 September 2015 в 21:58
  • 3
    Правда. удален .. – Row1e 6 October 2015 в 09:07
  • 4
    Обратите внимание, что для любого из Windows, у которого есть эта проблема (я понимаю, что этот вопрос касается не Windows, но я был, и я приехал сюда путем поиска & quot; Я не буду открывать соединение с & quot;). : согласно Как использовать пассивный режим FTP в командной строке Windows? и его ответы, FTP-клиент native Windows (даже до 10) не поддерживает пассивный режим, поэтому потребуется альтернатива (ответы на этот вопрос касаются WinSCP). – TripeHound 11 July 2018 в 07:02

Если вы используете редактор PsPad, и у вас такая же проблема, попробуйте установить эту конфигурацию для вашего соединения:

2
ответ дан paulalexandru 21 August 2018 в 06:00
поделиться
  • 1
    Что такое & quot; эта конфигурация & quot; ? Просьба описать это словами, а не просто использовать скриншот. – Martin Prikryl 7 January 2017 в 20:27
  • 2
    Это не просто скриншот, как вы видите, я написал, что это способ установить ваше соединение для работы, у меня была эта проблема, и я не нашел решение нигде, я нашел его сегодня сам, и я хотел помочь другим не чтобы таить свое время, как я. – paulalexandru 7 January 2017 в 20:30
  • 3
    Скриншоты полезны в ответах? - «Нет ничего плохого в публикации скриншота, чтобы показать пользователям, как что-то работает, , пока скриншот сопровождается текстовой информацией, которая объясняет то же самое в словах & quot; – Martin Prikryl 7 January 2017 в 20:35
  • 4
    Я не системный администратор, я не могу сказать, почему он работает так, и он не работает по-другому. Единственное, что для меня это сработало с этими настройками, и я хотел, чтобы другие извлекли выгоду из этого. Если вы считаете, что они должны искать свой собственный, это не проблема для меня, я просто удалю ответ. – paulalexandru 7 January 2017 в 20:38
  • 5
    Конечно! Просто напишите, "проверьте опцию XXX, чтобы она работала & quot; . На снимке экрана есть десяток вариантов. Откуда мы знаем, что такое magical ? – Martin Prikryl 7 January 2017 в 20:39

Включите свой FTP в пассивном режиме, если вы уже подключили, введите

ftp> passive
Passive mode on.

В настоящее время вы используете FTP в пассивном режиме.

18
ответ дан RizonBarns 21 August 2018 в 06:00
поделиться
  • 1
    В качестве примечания - пассивное - логическое, которое будет переключаться между пассивным режимом и активным режимом в ftp. Это может ввести в заблуждение тех, кто раньше не переключал режимы. – Ryan Rentfro 18 December 2015 в 18:41
  • 2
    Спасибо за объяснение. Да, конечно, он переключает пассивный или активный режим. В большинстве случаев FTP-сервер использует пассивный режим в качестве подключения по умолчанию. – RizonBarns 22 December 2015 в 02:48
  • 3
    @RizonBarns В протоколе FTP нет режима по умолчанию. И сервер в любом случае не контролирует режим. Таким образом, & quot; FTP-сервер использует пассивный режим как соединение по умолчанию & quot; - это просто глупость. Это клиент FTP, который выбирает режим перед каждой передачей. – Martin Prikryl 9 December 2016 в 15:32
Другие вопросы по тегам:

Похожие вопросы: