一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

PHP中Libevent HTTP客户端实现程序

时间:2022-06-24 17:55:09 编辑:袖梨 来源:一聚教程网

php Libevent HTTP

代码如下 复制代码

//请求完成回调
function _request_handler($req, $base) {
global $pend_req;
//echo __FUNCTION__, PHP_EOL;

if (is_null($req)) {
//echo "Timed out\n";
} else {
$response_code = $req->getResponseCode();

if ($response_code == 0) {
//echo "Connection refused\n";
} elseif ($response_code != 200) {
//echo "Unexpected response: $response_code\n";
} else {
//echo "Success: $response_code\n";
/*
$buf = $req->getInputBuffer();
echo "Body:\n";
while ($s = $buf->readLine(EventBuffer::EOL_ANY)) {
echo $s, PHP_EOL;
}
*/
}
}
$pend_req--;
//退出循环
if (!$pend_req) {
$base = $conn->getBase();
$base->exit(NULL);
}
//释放内存
unset($req);
unset($conn);
}

//$address = "www.111com.net";
$pend_req = 0;
$port = 80;
//初始化event base
$base = new EventBase();
echo "Event method used: ", $base->getMethod(), PHP_EOL;
//使用异步DNS
$dns_base = new EventDnsBase($base, TRUE);
$f= fopen("./50000.txt","r");
while (!feof($f))
{
$line = fgets($f);
//echo $address;
$address = trim($line);
//新建http连接事件到base
$conn = new EventHttpConnection($base, $dns_base, $address, $port);
$conn->setTimeout(1);
//设置请求回调
$req = new EventHttpRequest("_request_handler", $conn);

$req->addHeader("Host", $address, EventHttpRequest::OUTPUT_HEADER);
$req->addHeader("Content-Length", "0", EventHttpRequest::OUTPUT_HEADER);
$conn->makeRequest($req, EventHttpRequest::CMD_GET, "/");
$pend_req++;
}
fclose($f);
//事件主循环
$base->loop();
?>

c语言版,

代码如下 复制代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef struct my_struct_s my_struct_t;

struct my_struct_s {
struct evhttp_connection *conn;
struct evhttp_request *req;
struct evhttp_uri *uri;
struct event *cleanup;
};

struct event_base *Base_Primary;

char *trimwhitespace(char *str)
{
char *end;

// Trim leading space
while(isspace(*str)) str++;

if(*str == 0) // All spaces?
return str;

// Trim trailing space
end = str + strlen(str) - 1;
while(end > str && isspace(*end)) end--;

// Write new null terminator
*(end+1) = 0;

return str;
}

void connection_free(int sock, short which, void *arg) {
//printf("freeing connection!!! The socket's FD would have been closed when the HTTP request ended and the ->req object would have been free'd\n");

// Get our structure object
my_struct_t *myStruct = arg;

// Cleanup our properties
event_free(myStruct->cleanup);
evhttp_connection_free(myStruct->conn);
evhttp_request_free(myStruct->req);
evhttp_uri_free(myStruct->uri);

// Free our custom structure
free(myStruct);
}

void http_request_done(struct evhttp_request *req, void *arg){

// Get our custom struct
my_struct_t *myStruct = arg;

// Setup our timeout information (we delay 5 seconds)
struct timeval Timeout;
Timeout.tv_sec = 0;
Timeout.tv_usec = 0;

// Add this structure to our cleanup base to be cleaned up synchronously
// TODO: Probably not the best way to cleanup and event, but it'l work for the purposes of illustration.
// This way would ensure no race conditions exist, but it's probably not the most efficient depending on how many requests, etc we're dealing with.
myStruct->cleanup = evtimer_new(Base_Primary, connection_free, (void *)myStruct);
evtimer_add(myStruct->cleanup, &Timeout);

//printf("http_request_done, we put our custom strucutre into a cleanup event to be freed!\n");
}

int http_req(char *uri) {

// Allocate our custom struture
my_struct_t *myStruct = malloc(sizeof(my_struct_t));

// Create our EVHTP connection and request
myStruct->uri = evhttp_uri_parse(uri);
myStruct->conn = evhttp_connection_base_new(Base_Primary, NULL, uri, 80);
myStruct->req = evhttp_request_new(http_request_done, myStruct);
evhttp_add_header(evhttp_request_get_output_headers(myStruct->req), "Host", "localhost");
evhttp_add_header(evhttp_request_get_output_headers(myStruct->req), "Connection", "close");
evhttp_make_request(myStruct->conn, myStruct->req, EVHTTP_REQ_GET, uri);
evhttp_connection_set_timeout(myStruct->req->evcon, 2);
return 1;
}


// Define our primary function
int main(int argc, char *argv[]) {

// Initialize our bases
Base_Primary = event_base_new();

char filename[] = "/tmp/50000.txt"; //文件名
FILE *fp;
char StrLine[1024]; //每行最大读取的字符数
char *host;
if((fp = fopen(filename,"r")) == NULL) //判断文件是否存在及可读
{
printf("error!");
return -1;
}

while (!feof(fp))
{
fgets(StrLine,1024,fp); //读取一行
host = StrLine;
host = trimwhitespace(host);
//printf("%s", host); //输出
http_req(host);
}
fclose(fp);

//
//event_base_loop(Base_Primary);
event_base_dispatch(Base_Primary);

// Free our primary base
event_base_free(Base_Primary);
return 1;
}

热门栏目