сокет Java / записи потока вывода: действительно ли они блокируются?

Я полагаю, что это - то, что Вы ищете, " Офлайновый Пароль NT & Редактор реестра " (chntpw)

, Что такое chntpw?

chntpw является утилитой программного обеспечения для сброса или очищения локальных паролей, используемых Windows NT, 2000, XP, Vista, 7, и 8.1. Это также содержит простой редактор реестра и Hex-редактор, с которым информация, содержавшаяся в файле реестра, может быть просмотрена и изменена в соответствии с linux/unix.

, Как установить?

можно установить его от терминала путем выполнения этой команды:

sudo apt-get install chntpw

Или поиск "chntpw" в Центре программного обеспечения.

Дополнительные источники:

Используя chntpw в Ubuntu для Взламывания Windows Registry

Изменение или пароль Windows Сброса из Ubuntu Живой CD

35
задан user207421 17 April 2015 в 22:58
поделиться

1 ответ

Запись в сокет также может блокироваться, особенно если это сокет TCP. ОС будет буферизовать только определенный объем непереданных (или переданных, но неподтвержденных) данных. Если вы пишете данные быстрее, чем удаленное приложение может их прочитать, сокет в конечном итоге создаст резервную копию, и ваши вызовы write будут заблокированы.

Ответ на следующие вопросы:

Так есть ли механизм для установления тайм-аут для этого? Я не уверен что поведение, которое у него было бы ... может быть, выбросить данные, если буферы заполнены? Или возможно удалить старые данные в буфере?

Нет механизма для установки тайм-аута записи в java.net.Socket. Существует метод Socket.setSoTimeout () , но он влияет на вызовы accept () и read () ... а не write () звонит. По-видимому, вы можете получить тайм-ауты записи, если используете NIO, неблокирующий режим и селектор, но это не так полезно, как вы могли бы представить.

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

Напротив, если вы используете сокет UDP, вызовы write () не будут блокироваться в течение какого-либо значительного периода времени. Но обратная сторона заключается в том, что если есть проблемы с сетью или удаленное приложение не справляется, сообщения будут сброшены на пол без уведомления ни в одном из них. Кроме того, вы можете обнаружить, что сообщения иногда доставляются в удаленное приложение не по порядку. Вы (разработчик) будете решать эти проблемы.

* Теоретически это возможно, но для большинства приложений не имеет смысла реализовывать дополнительный механизм повторной синхронизации поверх уже надежного (до точка) TCP / IP поток. И если бы это имело смысл, вам также нужно было бы иметь дело с возможностью закрытия соединения ... поэтому было бы проще предположить , что оно закрыто.

48
ответ дан 27 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

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