libevent http client 客户端

来源:互联网 发布:网络推广员面试题 编辑:程序博客网 时间:2024/05/17 01:49
  1. /* Don’t actually copy this code: it is a poor way to implement an 
  2. HTTP client. Have a look at evhttp instead.*/  
  3. #include <event2/dns.h>  
  4. #include <event2/bufferevent.h>  
  5. #include <event2/buffer.h>  
  6. #include <event2/util.h>  
  7. #include <event2/event.h>  
  8. #include <stdio.h>  
  9. void readcb(struct bufferevent* bev, void * ptr)  
  10. {  
  11.     char buf[1024];  
  12.     int n;  
  13.     struct evbuffer* input = bufferevent_get_input(bev);  
  14.     while ((n = evbuffer_remove(input, buf, sizeof(buf))) > 0)   
  15.         {  
  16.             fwrite(buf, 1, n, stdout);  
  17.         }  
  18. }  
  19. void eventcb(struct bufferevent* bev, short events, void * ptr)  
  20. {  
  21.     if (events & BEV_EVENT_CONNECTED)   
  22.     {  
  23.         printf("Connect okay.\n");  
  24.     }   
  25.     else if (events & (BEV_EVENT_ERROR|BEV_EVENT_EOF))  
  26.     {  
  27.         struct event_base* base = ptr;  
  28.         if (events & BEV_EVENT_ERROR)   
  29.         {  
  30.             int err = bufferevent_socket_get_dns_error(bev);  
  31.             if (err)  
  32.             printf("DNS error: %s\n", evutil_gai_strerror(err));  
  33.         }  
  34.         printf("Closing\n");  
  35.         bufferevent_free(bev);  
  36.         event_base_loopexit(base, NULL);  
  37.     }  
  38. }  
  39. int main(int argc, char** argv)  
  40. {  
  41.     struct event_base* base;  
  42.     struct evdns_base* dns_base;  
  43.     struct bufferevent* bev;if (argc != 3)   
  44.     {  
  45.         printf("Trivial HTTP 0.x client\n"  
  46.         "Syntax: %s [hostname] [resource]\n"  
  47.         "Example: %s www.google.com /\n",argv[0],argv[0]);  
  48.         return 1;  
  49.     }  
  50.     base = event_base_new();  
  51.     dns_base = evdns_base_new(base, 1);  
  52.     bev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE);  
  53.     bufferevent_setcb(bev, readcb, NULL, eventcb, base);  
  54.     bufferevent_enable(bev, EV_READ|EV_WRITE);  
  55.     evbuffer_add_printf(bufferevent_get_output(bev), "GET %s\r\n", argv[2]);  
  56.     bufferevent_socket_connect_hostname(bev, dns_base, AF_UNSPEC, argv[1], 80);  
  57.     event_base_dispatch(base);  
  58.     return 0;  
  59. }  
0 0
原创粉丝点击