Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
76
Добавлен:
02.04.2015
Размер:
8.79 Mб
Скачать
    1. Коннекции

Процесс, устанавливающий коннекцию, использует объект, называемый коннектором. Коннектор является именем, которое сервер создаёт и которым владеет, и к которому клиент прикрепляет свою коннекцию. Коннектор используется только для установки коннекции.

Коннектор имеет числовой идентификатор и может также иметь имя, с ним связанное. И имя, и идентификатор являются уникальными для своей сессии Photon'а. Вот несколько примеров того, как может быть использовано имя:

  • Когда сервер запускается, он создаёт коннектор с общеизвестным именем (напр., HelpViewer). Клиенты коннектируются к нему, отсылают запросы и затем отконнектируются. Если клиент при поиске имени терпит неудачу, он порождает сервер и повторяет попытку.

  • Сервер создаёт безымянный коннектор и как-то отсылает идентификатор коннектора потенциальному клиенту (эту схему используют события "перетащил-и-бросил"). Этот клиент затем использует идентификатор для коннекта с сервером.

  • Клиенту всегда требуется породить новый сервер для себя, даже если копия этого сервера уже запущена. Клиент создаёт "временное имя коннектора", передаёт его серверу в качестве аргумента командной строки или переменной окружения, и затем коннектится с этим сервером.

          1. Создание коннектора

Со стороны сервера используются следующие функции:

  • PtConnectorCreate()

  • PtConnectorDestroy()

  • PtConnectorGetId()

Со стороны клиента используются такие функции:

  • PtConnectionClientDestroy()

  • PtConnectionFindId()

  • PtConnectionFindName()

  • PtConnectionServerDestroy()

  • PtConnectionTmpName()

          1. Установка объекта коннекции

Эти функции используются для установки объекта коннекции:

  • PtConnectionClientGetUserData()

  • PtConnectionClientSetError()

  • PtConnectionClientSetUserData()

  • PtConnectionServerGetUserData()

  • PtConnectionServerSetError()

  • PtConnectionServerSetUserData()

  • PtConnectionAddMsgHandlers()

  • PtConnectionAddEventHandlers()

  • PtConnectionResizeEventBuffer()

          1. Сообщения

Эти функции используются для получения сообщений между клиентом и сервером

  • PtConnectionSend(), PtConnectionSendmx()

  • PtConnectionReply(), PtConnectionReplymx()

          1. Уведомления

  • PtConnectionFlush()

  • PtConnectionNotify()

          1. Локальные коннекции

Процесс может создавать коннекцию к самому себе. Поведение такой коннекции слегка отличается от поведения нормальной коннекции:

  • В случае нормальной коннекции функции PtConnectionSend(), PtConnectionSendmx() и PtConnectionNotify() просто отсылают сообщение или импульс, и никогда не исполняют никакого пользовательского кода (за исключением случая, когда функция PtConnectinNotify() требует сбросить буфер, что может привести к появлению событий Photon'а, обрабатываемых нормальным образом). Но когда коннекция локальная, функции PtConnectionSend(), PtConnectionSendmx() и PtConnectionNotify() непосредственно вызывают обработчик, и как вызывающий код, так и обработчик должны предусматривать все стороны этого эффекта.

  • Другим отличием является то, что обработчики вызываются из различного контекста. Обычно ответная реакция обработчика событий или обработчика сообщений вызывается из функции ввода. Поскольку функции ввода не вызываются до тех пор, пока Вы или не вернётесь в главную петлю, или не вызовите функцию PtBkgdHandlerProcess() или PtProcessEvent(), зачастую безопасным будет принимать, что обработчик не должен вызываться, пока исполняется ответная реакция. Но если коннекция локальная, обработчик вызывается непосредственно функциями PtConnectionSend(), PtConnectionSendmx() или PtConnectionNotify(), и принятые допущения должны быть соответствующим образом пересмотрены.

  • Ещё одним эффектом этого является то, что если обработчик сообщений вызывает PtConnectionNotify(), клиент получает уведомление перед ответом (перед reply). Иными словами, обработчик событий клиента вызывается до того, как выполнен возврат из функций PtConnectionSend() или PtConnectionSendmx(). Если обработчик снова вызывает функцию PtConnection() или PtConnectionSendmx(), возврат вернётся с ошибкой с errno, установленным в EBUSY (так библиотечная функция защищает себя от бесконечной рекурсии). Простейшим способом обойти это является отказ от посылки уведомлений из обработчика сообщений – вместо этого уведомление можно поместить в ответе (в reply).

Соседние файлы в папке Литература_1