首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

EventBufferEvent::connectHost

(PECL event >= 1.2.6-beta)

EventBufferEvent :: connectHost - 通过可选的异步 DNS 解析连接到主机名

描述

代码语言:javascript
复制
public bool EventBufferEvent::connectHost (  EventDnsBase $dns_base  ,  string $hostname  ,  int $port  [,  int $family  = EventUtil::AF_UNSPEC  ] )

解析 DNS 名称主机名,查找类型familyEventUtil :: AF_ *常量)的地址。如果名称解析失败,它会调用带有错误事件的事件回调。如果成功,它会像 EventBufferEvent :: connect()那样启动连接尝试。

dns_base是可选的。可能是NULL,或用 EventDnsBase :: __ construct()创建的对象。对于异步主机名解析传递有效的事件 dns 基础资源。否则,主机名解析会阻塞。

注意:EventDnsBase 仅在事件配置为--with-event-extra(event_extra库,libevent 协议特定的功能支持包括HTTP,DNS 和 RPC)时可用。

注意EventBufferEvent :: connectHost()需要 libevent-2.0.3-alpha 或更高版本。

参数

dns_base

如果 DNS 要异步解析,则使用 EventDnsBase 对象。否则NULL

hostname

连接到的主机名。可识别的格式是:

代码语言:javascript
复制
www.example.com (hostname)
 1.2.3.4 (ipv4address)
 ::1 (ipv6address)
[::1] ([ipv6address])

port

端口号

family

地址家庭。EventUtil::AF_UNSPECEventUtil::AF_INETEventUtil::AF_INET6。请参阅 EventUtil 常量。

返回值

TRUE成功返回。否则FALSE

例子

示例#1 EventBufferEvent :: connectHost()示例

代码语言:javascript
复制
<?php
/* Read 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;
    }
}

/* Event callback */
function eventcb($bev, $events, $base) {
    if ($events & EventBufferEvent::CONNECTED) {
        echo "Connected.\n";
    } elseif ($events & (EventBufferEvent::ERROR | EventBufferEvent::EOF)) {
        if ($events & EventBufferEvent::ERROR) {
            echo "DNS error: ", $bev->getDnsErrorString(), PHP_EOL;
        }

        echo "Closing\n";
        $base->exit();
        exit("Done\n");
    }
}

$base = new EventBase();

$dns_base = new EventDnsBase($base, TRUE); // We'll use async DNS resolving
if (!$dns_base) {
    exit("Failed to init DNS Base\n");
}

$bev = new EventBufferEvent($base, /* use internal socket */ NULL,
    EventBufferEvent::OPT_CLOSE_ON_FREE | EventBufferEvent::OPT_DEFER_CALLBACKS,
    "readcb", /* writecb */ NULL, "eventcb", $base
);
if (!$bev) {
    exit("Failed creating bufferevent socket\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("Failed adding request to output buffer\n");
}

if (!$bev->connectHost($dns_base, $argv[1], 80, EventUtil::AF_UNSPEC)) {
    exit("Can't connect to host {$argv[1]}\n");
}

$base->dispatch();
?>

上面的例子会输出类似于:

代码语言:javascript
复制
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 套接字

← EventBufferEvent::connect

EventBufferEvent::__construct →

扫码关注腾讯云开发者

领取腾讯云代金券