01
23

libevent-很好用,是真的

softpapa建議使用的libevent真的很好用,callback明確簡單,程式寫起來不複雜,libevent我看到國內已經有人幫它寫了三篇教學文章,都相當不錯,我想以後碰到socket programming乾脆就用這套打死算了

小弟簡單用libevent比照此網誌寫了簡單的web server,並做apache benchmark,真機車,libevent效能夠可怕,數據如下

[libevent]
50個人同時連線的情況下,每秒鐘的Request次數:    251.61 [#/sec] (mean)
50個人裡「平均」每個人感受到的回應時間    :    198.812 [ms] (mean)

小弟程式碼列如下

  1. #include <sys/types.h> 
  2. #include <sys/stat.h> 
  3. #include <sys/queue.h> 
  4. #include <unistd.h> 
  5. #include <sys/time.h> 
  6. #include <fcntl.h> 
  7. #include <stdlib.h> 
  8. #include <stdio.h> 
  9. #include <string.h> 
  10. #include <errno.h> 
  11. #include <event.h> 
  12. #include <sys/socket.h> 
  13. #include <arpa/inet.h> 
  14. #include <netdb.h> 
  15.  
  16. #define WEBMSG "HTTP/1.1 200 OK\r\nContent-Length: 29\r\nConnection: close\r\nContent-Type: text/html\r\n\r\nHello This is libevent server"
  17.  
  18. static void sock_response(int fd, short event, void *arg) 
  19. { 
  20. char buffer[1500];
  21.  
  22. struct event *ev = arg;
  23. read(fd,buffer,1500);
  24. printf("%s\n",buffer);
  25. write(fd,WEBMSG,strlen(WEBMSG));
  26. event_del(ev);
  27. close(fd);
  28. } 
  29.  
  30. static void sock_connect(int fd, short event, void *arg) 
  31. { 
  32. struct event *evfifo;
  33. struct sockaddr_in client;
  34. int connfd,clnlen;
  35.  
  36. clnlen=sizeof(client);
  37. connfd=accept(fd,(struct sockaddr *)&client,&clnlen);
  38. if (connfd <0) 
  39. { 
  40. perror("accept");
  41. return;
  42. } 
  43. evfifo=malloc(sizeof(struct event));
  44. event_set(evfifo, connfd, EV_READ, sock_response, evfifo);
  45. event_add(evfifo, NULL);
  46.  
  47. } 
  48.  
  49. int main(int argc,char *argv[]) 
  50. { 
  51. struct event evfifo;
  52. struct sockaddr_in serv;
  53. int sockfd;
  54.  
  55. /*initial server socket*/ 
  56. memset(&serv,0,sizeof(serv));
  57. serv.sin_family=AF_INET;
  58. serv.sin_addr.s_addr=inet_addr("192.168.15.25");
  59. serv.sin_port=htons(5050);
  60.  
  61. sockfd=socket(AF_INET,SOCK_STREAM,0);
  62. if (sockfd==-1) 
  63. { 
  64. perror("sockfd");
  65. return 0;
  66. } 
  67. if (bind(sockfd,(struct sockaddr *)&serv,sizeof(serv))==-1) 
  68. { 
  69. perror("bind");
  70. return 0;
  71. } 
  72. if (listen(sockfd,1024)==-1) 
  73. { 
  74. perror("listen");
  75. return 0;
  76. } 
  77. /* Initalize the event library */ 
  78. event_init();
  79. event_set(&evfifo, sockfd, EV_READ|EV_PERSIST, sock_connect, &evfifo);
  80. /* Add it to the active events, without a timeout */ 
  81. event_add(&evfifo, NULL);
  82.  
  83. event_dispatch();
  84. close(sockfd);
  85. }

標籤: linux
評論: 2 | 引用: 0 | 閱讀: 17029
  • 1 
shiausan [ 2009-11-26 09:42 | 回覆 | 編輯 刪除 ]
Hi,請教個問題

使用MinGW編譯

windows下執行程式時,在event_init()這個函數就印出

[err] evsignal_init: socketpair: No error

然後程式就沒有繼續往下執行

不知道是否有哪位大哥知道發生的原因,煩請賜教
Joey [ 回復於2010-02-04 19:06 郵箱 | 編輯 刪除 ]
I have never ever tested libevent under windows. Please go to libevent's mailing list to ask.
http://archives.seul.org/libevent/users/
  • 1 
發表評論
暱 稱: 密 碼:
網 址: E - mail:
驗證碼: 驗證碼圖片 選 項:
頭 像:
內 容: