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;
}