libevent http服务器实现

#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <event.h>
#include <evhttp.h>
 
void httpserver_handler(struct evhttp_request *req, void *arg)
{
	const char *cmdtype; 
	struct evbuffer *buf = evbuffer_new();
	if (buf == NULL) 
	{
		printf("evbuffer_new error !\n");
		return;
	}
	
	switch (evhttp_request_get_command(req))
	{  
		case EVHTTP_REQ_GET:    cmdtype = "GET";    break;  
		case EVHTTP_REQ_POST:   cmdtype = "POST";   break;  
		case EVHTTP_REQ_HEAD:   cmdtype = "HEAD";   break;  
		case EVHTTP_REQ_PUT:    cmdtype = "PUT";    break;  
		case EVHTTP_REQ_DELETE: cmdtype = "DELETE"; break;  
		case EVHTTP_REQ_OPTIONS:cmdtype = "OPTIONS";break;  
		case EVHTTP_REQ_TRACE:  cmdtype = "TRACE";  break;  
		case EVHTTP_REQ_CONNECT:cmdtype = "CONNECT";break;  
		case EVHTTP_REQ_PATCH:  cmdtype = "PATCH";  break;  
		default: cmdtype = "unknown"; break;  
	}

	printf("%s url=%s \n", cmdtype, evhttp_request_get_uri(req));

	evbuffer_add_printf(buf,"<html>\n"
			"<head>\n"
            "  <title>Libevnet Test</title>\n"          
            "</head>\n"
			"<body>\n"
            "  <h1>Hello world ,This is a Libenvet Test !</h1>\n"          
            "</body>\n"
			"</html>\n");
	evhttp_send_reply(req, 200, "OK", buf);  
} 
 
int httpserver_bindsocket(int port, int backlog)
{
	int ret;
	int fd;
	fd = socket(AF_INET, SOCK_STREAM, 0);
	if (fd < 0) 
	{
		printf("socket error !\n");
		return -1;
	}

	int opt = 1;
	ret = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(int));

	struct sockaddr_in addr;
	memset(&addr, 0, sizeof(addr));
	addr.sin_family = AF_INET;
	addr.sin_addr.s_addr = INADDR_ANY;
	addr.sin_port = htons(port);

	ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
	if (ret < 0) 
	{	
		printf("bind error !\n");
		return -1;
	}
	ret = listen(fd, backlog);
	if (ret < 0) 
	{
		printf("listen error !\n");
		return -1;
	}

	int flags;
	if ((flags = fcntl(fd, F_GETFL, 0)) < 0
		|| fcntl(fd, F_SETFL, flags | O_NONBLOCK) < 0)
	{
		printf("fcntl error !\n");
		return -1;
	}
	return fd;
}
 
int httpserver_start(int port, int backlog)
{
	int ret;
	int fd = httpserver_bindsocket(port, backlog);
	if (fd < 0) 
	{	
		return -1;
		printf("httpserver_bindsocket error !\n");
	}
	struct event_base *base = event_init();
	if (base == NULL) 
	{
		printf("event_init error !\n");
		return -1;		
	}
	struct evhttp *httpd = evhttp_new(base);
	if (httpd == NULL) 
	{
		printf("enhttp_new error !\n");
		return -1;
	}
	ret = evhttp_accept_socket(httpd, fd);
	if (ret != 0) 
	{
		printf("evhttp_accept_socket error \n");
		return -1;
	}
	evhttp_set_gencb(httpd, httpserver_handler, NULL);
	event_base_dispatch(base);
	return 0;
}
 
int main(void)
{
    httpserver_start(8000, 128);
	return 0;
}


编译运行,在浏览器中输入:

http://192.168.2.86:8000

回车,出现

libevent http服务器实现_第1张图片


测试成功!




你可能感兴趣的:(libevent http服务器实现)