Connexion à un hôte avec résolution DNS optionnellement asynchrone

# EventBufferEvent::connectHost

(PECL event >= 1.2.6-beta)

EventBufferEvent::connectHost — Connexion à un hôte avec résolution DNS optionnellement asynchrone

### Description

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

Résout le nom d'hôte DNS, recherche de l'adresse du type `family` (constante `EventUtil::AF_*`). Si la résolution du nom échoue, la fonction de rappel de l'événement sera appelée avec un événement d'erreur. Si la résolution réussit, une tentative de connexion sera émise, tout comme le fait la méthode EventBufferEvent::connect().

Le paramètre `dns_base` est optionnel. Il peut valoir `null`, ou bien un objet créé avec la méthode EventDnsBase::__construct(). Pour une résolution de nom d'hôte asynchrone, il faut passer une ressource d'événement de base DNS valide. Sinon, la résolution du nom d'hôte sera bloquante.

> Note:

> EventDnsBase n'est disponible que si `Event` est configuré avec l'option --with-event-extra (bibliothèque `event_extra`, le support des fonctionnalités spécifiques à libevent incluant HTTP, DNS et RPC).

> Note:

> EventBufferEvent::connectHost() requiert `libevent-2.0.3-alpha` ou suivants.

### Liste de paramètres

`dns_base`
  Objet EventDnsBase dans le cas où le DNS doit être résolu de façon asynchrone. Sinon, `null`.
`hostname`

  Le nom d'hôte sur lequel la connexion tente d'être faite. Les formats reconnus sont :

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

`port`

  Le numéro du port

`family`

  Famille de l'adresse. `EventUtil::AF_UNSPEC`, `EventUtil::AF_INET` ou `EventUtil::AF_INET6`. Voir les constantes EventUtil.

### Valeurs de retour

Cette fonction retourne `true` en cas de succès ou `false` si une erreur survient.

### Exemples

Exemple #1 Exemple avec EventBufferEvent::connectHost()

    <?php
    /* Fonction de rappel de lecture */
    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;
        }
    }

    /* Fonction de rappel de l'événement */
    function eventcb($bev, $events, $base) {
        if ($events & EventBufferEvent::CONNECTED) {
            echo "Connecté.\n";
        } elseif ($events & (EventBufferEvent::ERROR | EventBufferEvent::EOF)) {
            if ($events & EventBufferEvent::ERROR) {
                echo "Erreur DNS : ", $bev->getDnsErrorString(), PHP_EOL;
            }

            echo "Fermeture\n";
            $base->exit();
            exit("Fait !\n");
        }
    }

    $base = new EventBase();

    $dns_base = new EventDnsBase($base, TRUE); // Résolution DNS asynchrone
    if (!$dns_base) {
        exit("Échec de l'initialisation de la base DNS\n");
    }

    $bev = new EventBufferEvent($base, /* utilisation d'un socket interne */ NULL,
        EventBufferEvent::OPT_CLOSE_ON_FREE | EventBufferEvent::OPT_DEFER_CALLBACKS,
        "readcb", /* writecb */ NULL, "eventcb", $base
    );
    if (!$bev) {
        exit("Échec lors de la création du socket 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("Échec lors de l'ajout de la demande dans le tampon de sortie\n");
    }

    if (!$bev->connectHost($dns_base, $argv[1], 80, EventUtil::AF_UNSPEC)) {
        exit("Impossible de se connecter à l'hôte {$argv[1]}\n");
    }

    $base->dispatch();
    ?>

Résultat de l'exemple ci-dessus est similaire à :

    Connecté.
    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>
    Fermeture
    Fait !

### Voir aussi

- EventBufferEvent::connect() - Connecte le descripteur de fichier du tampon d'événement à l'adresse fournie, ou au socket UNIX

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