Соединяется с хостом по имени с необязательным асинхронным разрешением DNS-имени

# EventBufferEvent::connectHost

(PECL event >= 1.2.6-beta)

EventBufferEvent::connectHost — Соединяется с хостом по имени с необязательным асинхронным разрешением DNS-имени

### Описание

public function EventBufferEvent::connectHost(
EventDnsBase `$dns_base` ,
string `$hostname` ,
int `$port` ,
int `$family` = EventUtil::AF_UNSPEC
): bool

Метод разрешает DNS-имя хоста путём поиска адресов, тип которых указали в параметре `family` константой семейства `EventUtil::AF_*`. При ошибке разрешения имени метод вызывает callback-функцию события с событием ошибки. Метод, если завершается успешно, запускает попытку подключения так же, как это сделал бы метод EventBufferEvent::connect().

Параметр `dns_base` необязателен и принимает значение `null` или ссылается на объект, который создали методом EventDnsBase::__construct(). Для асинхронного разрешения имени хоста потребуется передать действительный базовый ресурс DNS-события, иначе разрешение имени хоста заблокируется.

> Замечание:

> Класс EventDnsBase доступен, только если модуль `Event` сконфигурировали с параметром --with-event-extra (библиотека `event_extra`, поддержка функций протокола libevent, включая протокол HTTP, систему DNS и проткол RPC).

> Замечание:

> Методу EventBufferEvent::connectHost() требуется модуль `libevent-2.0.3-alpha` или выше.

### Список параметров

`dns_base`
  В параметр передают объект EventDnsBase, если DNS-имя требуется разрешить асинхронно, иначе значение `null`.
`hostname`

  Имя хоста для подключения. Распознаваемые форматы:

      www.example.com (hostname)
       1.2.3.4 (ipv4address)
       ::1 (ipv6address)
      [::1] ([ipv6address])

`port`

  Номер порта.

`family`

  Семейство адресов. `EventUtil::AF_UNSPEC`, `EventUtil::AF_INET` или `EventUtil::AF_INET6`. Смотрите константы класса EventUtil.

### Возвращаемые значения

Функция возвращает `true`, если выполнилась успешно, или `false`, если возникла ошибка.

### Примеры

Пример #1 Пример работы метода EventBufferEvent::connectHost()

    <?php

    /* Callback-функция чтения */
    function readcb($bev, $base)
    {
        // $input = $bev->input; //$bev->getInput();

        // $pos = $input->search("TTP");
        $pos = $bev->input->search("TTP");

        while (($n = $bev->input->remove($buf, 1024)) > 0) {
            echo $buf;
        }
    }

    /* Callback-функция события */
    function eventcb($bev, $events, $base)
    {
        if ($events & EventBufferEvent::CONNECTED) {
            echo "Подключено.\n";
        } elseif ($events & (EventBufferEvent::ERROR | EventBufferEvent::EOF)) {
            if ($events & EventBufferEvent::ERROR) {
                echo "Ошибка DNS: ", $bev->getDnsErrorString(), PHP_EOL;
            }

            echo "Закрытие\n";
            $base->exit();
            exit("Выполнено\n");
        }
    }

    $base = new EventBase();

    $dns_base = new EventDnsBase($base, TRUE); // Асинхронное разрешение DNS-имени
    if (!$dns_base) {
        exit("Не удалось запустить базу DNS\n");
    }

    $bev = new EventBufferEvent($base, /* Использовать внутренний сокет */ NULL,
        EventBufferEvent::OPT_CLOSE_ON_FREE | EventBufferEvent::OPT_DEFER_CALLBACKS,
        "readcb", /* writecb */ NULL, "eventcb", $base
    );
    if (!$bev) {
        exit("Не удалось создать сокет bufferevent\n");
    }

    // $bev->setCallbacks("readcb", /* writecb */ NULL, "eventcb", $base);
    $bev->enable(Event::READ | Event::WRITE);

    $output = $bev->output; //$bev->getOutput();
    if (!$output->add(
        "GET {$argv[2]} HTTP/1.0\r\n".
        "Host: {$argv[1]}\r\n".
        "Connection: Close\r\n\r\n"
    )) {
        exit("Не удалось добавить запрос в выходной буфер\n");
    }

    if (!$bev->connectHost($dns_base, $argv[1], 80, EventUtil::AF_UNSPEC)) {
        exit("Не удалось подключиться к хосту {$argv[1]}\n");
    }

    $base->dispatch();

    ?>

Вывод приведённого примера будет похож на:

    Connected.
    HTTP/1.0 301 Moved Permanently
    Location: http://www.google.co.uk/
    Content-Type: text/html; charset=UTF-8
    Date: Sat, 09 Mar 2013 12:21:19 GMT
    Expires: Mon, 08 Apr 2013 12:21:19 GMT
    Cache-Control: public, max-age=2592000
    Server: gws
    Content-Length: 221
    X-XSS-Protection: 1; mode=block
    X-Frame-Options: SAMEORIGIN

    <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
    <TITLE>301 Moved</TITLE></HEAD><BODY>
    <H1>301 Moved</H1>
    The document has moved
    <A HREF="http://www.google.co.uk/">here</A>.
    </BODY></HTML>
    Closing
    Done

### Смотрите также

- EventBufferEvent::connect() - Подключает файловый дескриптор события буфера к указанному адресу или сокету UNIX

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open