Знакомство с indy sasl

Indy 10 обзор | DelphiSite

знакомство с indy sasl

AFAIK, TIdIMAP SASL теперь работает отлично (учитывая, что я тот, кто его реализовал). У меня нет доступа к каким-либо серверам IMAP. шил после знакомства [GNU Pгivacy Assistaпt: skoro.info intevat i on.oгg l, а плагин SASL [ skoro.info skoro.info обеспечивает анонимную MUGELLO - HYPER SILVER. VAIRANO. INDY SILVERSTONE. NARDO. широко применяемых SGI в упитанных рабочих станциях Indy и Octane. Для ау тентификации Postfix использует Cyrus SASL, поэтому убедитесь, что позволяет использовать его как фундамент для знакомства с Linux и.

Перестройка ядра Ядро Indy 10 претерпело серьезные структурные изменения. Это конечно приведет к неработоспособно некоторого пользовательского кода, но изменения были сделаны так, чтобы быть как можно более совместимыми c протоколами и уровенем приложений. Иногда кажется, что команда Indy Pit Crew не заботится о конечных пользователях при внесении изменений.

Тем не менее, это не. Каждое изменение интерфейса оценивалось и взвешивалтсь доводы за и. Изменения, которые сделаны, были разработаны так, чтобы позволить простое преобразование существующего исходного кода с минимальными усилиями. Команда Indy Pit Crew использует Indy в частных и коммерческих разработках, так что каждое изменение прочувствовала на. Команда Indy Team верит, что прогресс не возможен без жертвоприношений. Благодаря небольшим изменениям в интерфейсах, было достигнуто значительное улучшение Indy.

Без этих изменений, мусор бы только накапливался и будущие улучшения были бы проблематичны. Переход от Winshoes к Indy 8 и затем, Indy 8 к Indy 9 увеличил уровень абстракции.

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

Тем не менее, в больших приложениях это приводит к сильному переключению контекста и накоплению накладных расходов. Данные ограничения появляются только в больших проектах при работе свыше 2 конкурентных потоков, в хорошо спроектированных приложениях. В большинстве приложений ограничения в пользовательском коде возникнут раньше, чем в Indy. Indy 10 сохраняет простоту использования модели блокирующих сокетов, достигая производительности внутри. Indy 10 делает это используя расширенные сетевые интерфейсы и эффективно транслируя это в дружественную пользователю модель блокирующих сокетов.

Этим Indy 10 обеспечивает обслуживание порядка Indy 10 достигает этого разными путями, но волокна fibers являются ключевым камнем данного достижения. Волокна очень похожи на потоки, но более гибки и имеет меньшую нагрузку, чем потоки, если использовать их должным образом. Сетевые интерфейсы Indy 9 имела только один сетевой интерфейс. В Windows этот интерфейс был Winsock и на Linux стек.

Indy 10 еще продолжает поддерживать этот интерфейс, но имеет также и более эффективные интерфейсы в Windows. В данное время никаких других интерфейсов в Linux не реализовано, но возможно они появятся в будущем.

Это не так важно в Linux, поскольку у него своя сетевая семантика. Некоторые из дополнительных интерфейсов не доступны во всех версиях Windows и должны использоваться только в серверных реализациях или в системах с высоким количеством клиентских соединений. Клиенты не нуждаются в этих продвинутых возможностях.

Indy 10, как всегда позаботится обо всех деталях и предоставит разработчику дружественный интерфейс. Волокна Fibers В дополнение к расширению поддержке потоков, Indy 10 содержит и поддержку волокна.

Если коротко, то это "поток", который контролируется кодом, а не операционной системой. В действительности, поток может быть трактоваться, как продвинутое волокно. Волокна подобны Unix пользовательским потокам. Вот и до слово блудились Что там на у них? Сейчас уже вроде есть потоки и процессы Поток — это базовая единица, которой операционная система выделяет время.

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

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

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

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

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

Должен ли я ожидать, что соединения Indy Imap SASL будут работать?

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

Рабочие очереди Рабочие очереди организованы по принципу первый на входе — первый на выходе FIFOи хранят операции work itemsзапрошенные волокнами. Work Items скорее всего абстракция для операции ввода-вывода, так как именно они блокируются Большинство данной функциональности полностью прозрачно для среднего разработчика, так как скрыто внутри Indy.

Цепочки судя по всему внутренняя абстракция Системные рабочие очереди, планировщики и драйверы цепочек в Indy относятся к цепочкам.

знакомство с indy sasl

Несмотря на то, что цепочки используются в Indy, они не ограничены внутренним использованием в Indy и могут также использоваться в пользовательском приложении. При использовании цепочки, IOHandler основанный на ней, помещает операцию в очередь.

Какого хрена здесь IOHandler? Мы вроде о волокнах говорим. Затем, волокно приостанавливаются пока операция не обработана. Волокно может ничего не делать, пока не будет завершена операция. События наиболее используемый метод, а циклы опроса менее эффективны. При использовании обработчиков событий, код размазан по куче процедур, поэтому требуется отслеживание состояния.

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

Но для тех кто программировал сокеты ранее, Indy будет камнем преткновения. Поскольку Indy работает совсем по другому. Попытка программировать в Indy тем же самым образом. Это не означает, что другие решения неправильные, просто Indy работает. Пытаться программировать в Indy так же, как с другими сокетными библиотеками, равносильна попытке приготовить пирожное в микроволновой печи, как в духовке. Результатом будет испорченное пирожное. Если вы использовали другие сокетные библиотеки ранее, пожалуйста следуйте следующему девизу: Это легко сказать, труднее сделать, менять привычки тяжело.

Чтобы подчеркнуть разницу, приведем абстрактный пример. Для абстрагирования концепции, используем в качестве аналога файлы. Данный документ подразумевает, что вы умеете работать с файлам. Надеемся, что Бейсик программисты не читают эту книгу Файлы против сокетов Разница между файлами и сокетами в основном в скорости доступа. Доступ к файлу не всегда быстрый.

Флоппи диски, сетевые диска, ленточные устройства архивирования и иерархические системы хранения часто имеют медленную скорость Сценарий записи в файл Представим простой сценарий записи в файл. Поскольку данная процедура очень простая, то она очень подходит демонстрации. Закрыть файл Блокирующий режим записи файла Блокирующая запись в файл выглядит следующим образом: TObject ; var s: File1 это условный неблокирующий компонент, размещенной на форме.

TObject ; begin File1. Open; end; procedure TForm1. TObject ; var i: Close; end; end; procedure TForm1. TObject ; begin Button1. Если вы используете неблокирующие сокеты, то вы должны легко понимать данный код. При вызове Button1Click открывается файл. Метод Open немедленно вернет управление в программу, но файл еще не открыт и нельзя с ним еще нельзя работать.

Обработчик события OnOpen будет возбужден, когда файл будет открыть и готов к работе. Делается попытка записать данные в файл, но все данные еще не акцептированы.

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

Шаг 3 повторяется до тех пор, пока все данные не будут записаны методом Write. По окончанию записи всех данных вызывается метод Close. Но файл пока еще не закрыт. The OnClose event is fired. The file is now closed Сравнение записи файлов Оба примера только записывают данные. Чтение и запись данных будут сложнее для неблокирующего режима, но только добавлением одной строки для блокирующего режима.

Для блокирующего примера, просто откройте, записывайте данные, и закройте файл когда необходимо: Дадим шанс выбора между обеими, если надо будет выбирать, то большинство выберет неблокирующий путь. Почти все сокетные функции используют неблокирующий режим Почти как файлы Использование Indy почти равносильно использованию файлов. В действительности Indy еще проще, поскольку Indy имеет ряд методов для чтения и записи. Indy пример, эквивалентный примеру с файлами выглядит так: Метод Connect замещает функцию Open, а метод Disconnect замещает функцию Close.

Если вы думаете и признаете сокеты как чтение и запись в файл, то вам будет использовать Indy очень. Введение в клиентов 6. Базовый клиент Базовый клиент Indy выглядит так: Это минимальный код, который требуется при написании клиента в Indy.

Минимальные требования для создания клиентов следующие: Требуется, если нет порта по умолчанию. Большинство протоколов имеют такой порт. Включает чтение и запись. Разъединение Обработка исключений Обработка исключений в клиентах Indy такая же как с файлами. Если ошибка возникнет во время выполнения любого метода Indy, то будет возбуждено соответствующее исключение. Для обработки исключения код надо помещать в блоки try. Также отсутствует событие OnError, так что не ищите.

Это может показаться странным, если вы уже работали с другими сокетными библиотеками, но посмотрите на TFileStream, он также не имеет события OnError, просто если есть проблема, то возбуждается исключение. Indy работает подобным образом. Подобно тому, как все открытые файлы должны быть закрыты, все вызовы Connect в Indy должны быть закрытым вызовом метода Disconnect. Базовые клиенты должны начитать работу следующим образом: Если вы желаете обрабатывать исключения Indy отдельно от исключений VCL, то это можно сделать, как в следующем примере.

Disconnect; end; except on E: Message ; end; end; Если произойдет ошибка во время вызова метода Connect, то она будет очищена самостоятельно перед возбуждения соответствующего исключения. Поэтому, try здесь после вызова метода Connect на не. Тем не менее, если исключение случится во время передачи данных, то будет возбуждено исключение raised. Это позволяет вам повторить операцию передаче или отсоединиться.

В приведенном выше примере, не делается никакой дополнительной обработки и сокет отсоединяется по любой ошибке, и производится нормальное завершение. Для обработки ошибок во время соединения и отделения от других ошибок связи, требуется изменить ваш код: Message ; end; on E: Message ; end; end; except on E: Message ; 33 34 end; end; Данный код не только проверяет исключения, которые возникают во время соединения, но и отделяет эти ошибки от других ошибок связи.

Дальше исключения Indy изолируются от других исключений Исключения это не ошибки Многие разработчики серьезно считаю, что исключения это ошибки. Но это не. Если бы это было так, то Borland бы назвал из ошибками, а не исключениями.

Исключение это что-то, что за пределами ординарного. В терминах программирования, исключение это что-то, что прерывает нормальный поток исполнения. Исключения используются для представления ошибок в Delphi и по этому большинство исключений это ошибки. Тем не менее, есть такие исключения, как EAbort, которое не является ошибкой. Indy также определяет ряд исключений, которые не являются ошибками. Такие исключения, как правило, наследованы от EIdSilentException и могут быть легко отделены от ошибок и других исключений.

Более сложный пример можно посмотреть в EIdConnClosedGracefully Компонент TIdAntiFreeze Indy имеет специальный компонент, который прозрачно разрешает проблему с замораживанием пользовательского интерфейса. Достаточно одного экземпляра компонента TIdAntiFreeze в приложении, позволяя использовать блокирующие вызовы в главном кодовом потоке, без замораживания пользовательского интерфейса.

TIdAntiFreeze работает внутренне, независимо от вызова стека, и позволяет обрабатывать сообщения в течении периода таймаута. Внешний вызовы Indy продолжают быть блокированы и их код работает точно так же, как и без компонента TIdAntiFreeze.

Поскольку пользовательский интерфейс замораживается только при вызове блокирующих сокетов в главном кодовом потоке, TIdAntiFreeze влияет только на вызовы Indy, сделанные из главного кодового потока. Но если используется, то влияет на вызовы сделанные только из главного кодового потока. Использование TIdAntiFreeze немного замедляет работу сокетов. Сколько давать приоритета приложению задается в свойствах TIdAntiFreeze. Причина, по которой TIdAntiFreeze замедляет сокетовые операции, состоит в том, что главному кодовому потоку разрешается обрабатывать сообщения.

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

Протокол очень простой и предполагается, что сервер уже реализован. В данной главе рассматривается только клиент. Исходные данные находятся на сервере для американских почтовых индексов. Американские почтовые индексы называемые zip коды состоят из 5 цифр. Код сервера будет приведен позже Проверка почтового индекса - протокол Протокол клиента очень прост, он содержит только две команды: Quit Общение с сервером выглядит так: The server responds with a greeting when the client connects.

Greetings and replies to commands typically contain a 3 digit number specifying status. This will be covered more in detail in later sections. После приветственного сообщения сервер готов принимать запросы от клиента. Если принята команда Lookup сервер отвечает списком почтовых кодов и далее соответствующим именем города и штата. Клиент может посылать множество команд, пока не выдаст команду Quit, после происходит рассоединение Объяснение кода Клиент просмотра почтового кода содержит две кнопки, listbox и memo.

Одна кнопка используется для очистки окна результатов, а другая для получения ответов от сервера и запрос информации от. Результаты помещаются в listbox. В обычном приложении, пользователь должен предоставить информацию об узле, порте и возможно о прокси. Но для демонстрации данная информация указана в коде. В качестве узла используется и порт Когда пользователь нажимает на кнопку Lookup, то выполняется следующий обработчик: Когда код выполняется, то блокируется кнопка, чтобы пользователь не мог послать другой запрос, пока не закончен текущий.

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

знакомство с indy sasl

Используя TIdTCPClient Client бросьте его на форму во время проектирования и попробуйте подключиться к серверу и подождите приветствия от сервера. GetResponse читает ответы и возвращает ответы как результат. В данном случае результат отбрасывается, но GetResult знает, что надо проверить ответ на число Если Сервет отвечает другим кодом, то возбуждается исключение. Сервер может отвечать разными кодами, если он, например, очень, находится на профилактике и так далее.

Для каждого почтового индекса, который вводит пользователь, пример посылает команду lookup на сервер и ожидает код ответа Если SendCmd закончится успешно, пример вызывает функцию Capture, которая читает ответы, пока не поступит с единственной точкой в строке.

Indy - RAD Studio

Поскольку демонстрационный пример за раз посылает одну команду, то ожидается одна строка в ответ, или ее отсутствие если индекс неверный. По окончанию пример шлет команду Quit и ожидает ответа с кодомкоторый означает, что сервер понял и отсоединяет клиента. Правильным поведением, является всегда посылка команды Quit, чтобы обе стороны знали что произошло разъединение 36 37 7. UDP позволяет посылать короткие пакеты на узел, без установки соединения с.

Для UDP пакетов не гарантируется доставка и не гарантируется тот же порядок приема, в каком они были посланы. При посылке UDP пакета, он посылается в одном блоке. Из-за этих факторов, многие люди считают UDP малопригодными.

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

UDP проходящие через Интернет как правило также надежны и могут использоваться совместно с коррекцией ошибок и более часто с интерполяцией.

Доставка, конечно, не гарантируется в любой сети, поскольку предполагается, что данные всегда достигают получателя. Поскольку UDP не имеет средств подтверждения доставки, то нет и гарантии ее доставки. Если вы посылаете UDP пакет на другой узел, вы не имеете возможности узнать доставлен ли пакет. Стек не в может и не будет определять это и не выдаст никакой ошибки если пакет не поступит получателю.

Если вам требуется такое подтверждение, то вы должны сами разработать механизм подтверждения. Другой пример из реальной жизни это отправка письма.

Вы можете его послать, но не гарантируется, что оно будет доставлено получателю. Оно может быть потеряно где ни будь Широкополосносные сообщения Broadcast UDP имеет уникальную возможность, что его делает очень применимым. Это возможность широкополосной посылки. Широкополосность Broadcast означает, что может быть послано одно сообщение, по получено многими получателями.

Это не то же самое, как многоадресность multicasting. Многоадресность это модель подписки. Когда получатели делают подписку на получение и они добавляются в список рассылки.

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

Широкополосные сообщения аналогичны радиовещанию От переводчика: Любой, кто имеет радиоприемник, может настроить его на любую радиостанцию и принимать. Радиослушатель не обязан оповещать радиостанцию, что он хочет слушать. Конкретный IP адрес для сообщения, можно рассчитать, основываясь на IP отправителя и маски сети.

Есть также особый случай, это адрескоторый так далеко, насколько это. Но почти все маршрутизаторы по умолчанию настроены так, чтобы фильтровать широкополосные сообщения. Это означает, что такие сообщения не проходят через мосты или внешние маршрутизаторы и зона их распространения ограничена локальной сетью Размеры пакетов Большинство операционных систем позволяют иметь размер UDP пакета 32K или даже 64K.

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

Но в некоторых случаях и этот размер велик. Для абсолютной гарантии делайте ваши пакеты в байт или менее Схемы подтверждений Обзор В локальной сети надежность UDP достаточно высокая. Но в случае WAN или Интернет вы, возможно, пожелаете разработать какую ни будь схему подтверждений Схема с подтверждениями В случаи схемы подтверждения, каждый пакет должен быть подтвержден получателем, как принятый.

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

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

Такое поведение при потерянных пакетов можно услышать при передачи реальной речи при передачи по сотовому телефону. В некоторых случаях вы слышите пропуски или заикания. Аргументом функции является строка. Есть также метод SendBuffer, который выполняет туже задачу, но аргументами являются Buffer и Size. Вне зависимость от состояния ThreadedEvent true или false, блокируется обработка других сообщений.

Данный пример это реальное приложение, которое может быть использовано для шуток в корпоративное среде. Тем не менее, он должен использоваться с осторожностью. Blue Screen Of Dead это знаменитый экран смерти на машинах коллег или врагов. Тем не менее, он должен напугать его startle. Сам BSOD также может быть сброшен удаленно.