牵着老婆满街逛

严以律己,宽以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

New libevent: dns and http support

from:http://unx.ca/log/2006/10/17/new-libevent-dns-and-http-support/

Last night Niels Provos announced the release of libevent 1.2. It comes with 2 new and useful features:

  • Non-blocking DNS resolution: previously you had to write your own, hunt down someone elses or uses threads to prevent DNS lookups from blocking your app. This came just at the right time for me as I was about to integrate someone elses non-blocking solution into my app.
  • Support for simple HTTP clients and servers: At first thought this may seem like unneeded bloat, and to many it might. I usually work on applications that lack a user interface and sometimes a simple http interface is very useful for debugging, or quickly adding some extra control to your application. This might even been robust enough to add a basic webservices like API to your application.

Non-blocking DNS example:

#include <sys/types.h>
#include <sys/time.h>
/* For inet_ntoa. */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <event.h>
#include <evdns.h>
void
usage(void)
{
fprintf(stderr, “USAGE: evdns-demo <hostname>n”);
exit(1);
}
void
evdns_cb(int result, char type, int count, int ttl, void *addresses, void *arg)
{
struct in_addr *addrs = addresses;
int i;
if (result != 0) {
printf(“Error looking up address.n”);
exit(1);
}
else {
for (i = 0; i < count; i++) {
printf(“%sn”, inet_ntoa(addrs[i]));
}
exit(0);
}
}
int
main(int argc, char **argv)
{
if (argc != 2)
usage();
event_init();
evdns_init();
evdns_resolve_ipv4(argv[1], 0, evdns_cb, NULL);
event_dispatch();
return (0);
}

http server example

#include <sys/types.h>
#include <sys/time.h>
#include <stdlib.h>
#include <err.h>
#include <event.h>
#include <evhttp.h>
void
root_handler(struct evhttp_request *req, void *arg)
{
struct evbuffer *buf;
buf = evbuffer_new();
if (buf == NULL)
err(1, “failed to create response buffer”);
evbuffer_add_printf(buf, “Hello World!n”);
evhttp_send_reply(req, HTTP_OK, “OK”, buf);
}
void
generic_handler(struct evhttp_request *req, void *arg)
{
struct evbuffer *buf;
buf = evbuffer_new();
if (buf == NULL)
err(1, “failed to create response buffer”);
evbuffer_add_printf(buf, “Requested: %sn”, evhttp_request_uri(req));
evhttp_send_reply(req, HTTP_OK, “OK”, buf);
}
int
main(int argc, char **argv)
{
struct evhttp *httpd;
event_init();
httpd = evhttp_start(“0.0.0.0″, 8080);
/* Set a callback for requests to “/”. */
evhttp_set_cb(httpd, “/”, root_handler, NULL);
/* Set a callback for all other requests. */
evhttp_set_gencb(httpd, generic_handler, NULL);
event_dispatch();
/* Not reached in this code as it is now. */
evhttp_free(httpd);
return 0;
}

posted on 2007-08-21 01:27 杨粼波 阅读(601) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理