libevent_echo.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "event2/event.h"
  5. #include "event2/listener.h"
  6. #include "event2/bufferevent.h"
  7. #include "event2/buffer.h"
  8. //#define RECV_BUFSIZE 8192
  9. void error_cb(struct bufferevent* bev, short event, void* userdata) {
  10. bufferevent_free(bev);
  11. }
  12. void read_cb(struct bufferevent* bev, void* userdata) {
  13. //static char recvbuf[RECV_BUFSIZE];
  14. //int nread = bufferevent_read(bev, &recvbuf, RECV_BUFSIZE);
  15. //bufferevent_write(bev, recvbuf, nread);
  16. struct evbuffer* buf = evbuffer_new();
  17. int ret = bufferevent_read_buffer(bev, buf);
  18. if (ret == 0) {
  19. bufferevent_write_buffer(bev, buf);
  20. }
  21. evbuffer_free(buf);
  22. }
  23. void on_accept(struct evconnlistener* listener, evutil_socket_t connfd, struct sockaddr* peeraddr, int addrlen, void* userdata) {
  24. struct event_base* loop = evconnlistener_get_base(listener);
  25. struct bufferevent* bev = bufferevent_socket_new(loop, connfd, BEV_OPT_CLOSE_ON_FREE);
  26. bufferevent_setcb(bev, read_cb, NULL, error_cb, NULL);
  27. bufferevent_enable(bev, EV_READ|EV_WRITE|EV_PERSIST);
  28. }
  29. int main(int argc, char** argv) {
  30. if (argc < 2) {
  31. printf("Usage: cmd port\n");
  32. return -10;
  33. }
  34. int port = atoi(argv[1]);
  35. struct event_base* loop = event_base_new();
  36. struct sockaddr_in addr;
  37. memset(&addr, 0, sizeof(addr));
  38. addr.sin_family = AF_INET;
  39. addr.sin_port = htons(port);
  40. struct evconnlistener* listener = evconnlistener_new_bind(
  41. loop, on_accept, NULL,
  42. LEV_OPT_REUSEABLE|LEV_OPT_CLOSE_ON_FREE,
  43. -1, (struct sockaddr*)&addr, sizeof(addr));
  44. if (listener == NULL) {
  45. return -20;
  46. }
  47. event_base_dispatch(loop);
  48. evconnlistener_free(listener);
  49. event_base_free(loop);
  50. return 0;
  51. }