服务端

severe.c

  1. // severe.c
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <event2/event.h>
  6. #include <event2/listener.h>
  7. #include <event2/bufferevent.h>
  8. #include "callbacks.h"
  9. int main()
  10. {
  11. // 创建event base
  12. struct event_base* base = NULL;
  13. base = event_base_new();
  14. if(base == NULL){
  15. perror("event base new error");
  16. exit(1);
  17. }
  18. // 填写套接字地址
  19. struct sockaddr_in saddr;
  20. memset(&saddr,0, sizeof(saddr));
  21. saddr.sin_family = AF_INET;
  22. saddr.sin_port = htons(9999);
  23. saddr.sin_addr.s_addr = htonl(INADDR_ANY);
  24. // 创建listern_cb回调函数的参数
  25. struct CallBackArgs* args = malloc(sizeof(struct CallBackArgs));
  26. args->base = base;
  27. // 申请套接字、绑定、监听
  28. struct evconnlistener* evl = NULL;
  29. evl = evconnlistener_new_bind(base,
  30. listen_cb,
  31. (void *)args,
  32. LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE,
  33. -1,
  34. (struct sockaddr*)&saddr,
  35. sizeof(saddr));
  36. if (evl == NULL){
  37. perror("event listener new bind error");
  38. exit(1);
  39. }
  40. // 开始运行
  41. int code;
  42. code = event_base_dispatch(base);
  43. if(code == -1){
  44. perror("event base dispatch error");
  45. exit(1);
  46. }
  47. // 资源关闭
  48. evconnlistener_free(evl);
  49. free(args);
  50. event_base_free(base);
  51. return 0;
  52. }

callbacks.h

  1. // callbacks.h
  2. #ifndef CLIBEVENT_CALLBACKS_H
  3. #define CLIBEVENT_CALLBACKS_H
  4. #include <event2/event.h>
  5. #include <event2/listener.h>
  6. #include <event2/bufferevent.h>
  7. /* 自定义回调参数数据结构 */
  8. struct CallBackArgs
  9. {
  10. struct event_base* base;
  11. };
  12. /** 监听listen回调函数
  13. * type: evconnlistener_cb
  14. * */
  15. void listen_cb(struct evconnlistener * evl, evutil_socket_t fd, struct sockaddr * caddr,
  16. int socklen, void * args);
  17. /**
  18. read回调函数
  19. type: bufferevent_data_cb
  20. */
  21. void read_cb(struct bufferevent *bfev, void *args);
  22. /**
  23. * write回调函数
  24. * type: bufferevent_data_cb
  25. * */
  26. void write_cb(struct bufferevent *bfev, void *args);
  27. /**
  28. * event回调函数
  29. * type: bufferevent_event_cb
  30. * */
  31. void event_cb(struct bufferevent *bfev, short what, void *args);
  32. #endif //CLIBEVENT_CALLBACKS_H

callbacks.c

  1. // callbacks.c
  2. #include "callbacks.h"
  3. #include <string.h>
  4. #include <ctype.h>
  5. #include <stdlib.h>
  6. void listen_cb(struct evconnlistener * evl, evutil_socket_t fd, struct sockaddr * caddr,
  7. int socklen, void * args)
  8. {
  9. // 获取参数
  10. struct CallBackArgs* cb_args = (struct CallBackArgs*) args;
  11. // 创建buffer event
  12. struct bufferevent* bfev = NULL;
  13. bfev = bufferevent_socket_new(cb_args->base,fd,BEV_OPT_CLOSE_ON_FREE);
  14. if(bfev == NULL){
  15. perror("buffer socket new error");
  16. return;
  17. }
  18. // 启用读写事件
  19. int code;
  20. code = bufferevent_enable(bfev,EV_READ | EV_WRITE);
  21. if(code == -1){
  22. perror("buffer event enable error");
  23. bufferevent_free(bfev);
  24. return;
  25. }
  26. // 注册回调函数
  27. bufferevent_setcb(bfev,
  28. read_cb,
  29. write_cb,
  30. event_cb,
  31. NULL);
  32. }
  33. void read_cb(struct bufferevent *bfev, void *args)
  34. {
  35. //接收数据
  36. char buff[1024] = {0};
  37. int len = bufferevent_read(bfev,buff, sizeof(buff));
  38. printf("接收到了数据:%s",buff);
  39. // 处理数据
  40. int i;
  41. for(i = 0;i<len ;++i){
  42. buff[i] = toupper(buff[i]);
  43. }
  44. // 发送数据
  45. int code;
  46. code = bufferevent_write(bfev,buff, strlen(buff)+1);
  47. if(code == -1){
  48. perror("buffer write error");
  49. return;
  50. }
  51. printf("我发回了数据:%s",buff);
  52. }
  53. void write_cb(struct bufferevent *bfev, void *args)
  54. {
  55. printf("我的数据发送完毕\n");
  56. }
  57. void event_cb(struct bufferevent *bfev, short what, void *args)
  58. {
  59. // 出现错误,释放资源,不做额外处理
  60. if(args)
  61. free(args);
  62. bufferevent_free(bfev);
  63. printf("关闭 buffer event\n");
  64. }

客户端

  1. // 发送一次数据并受到服务器返回后就退出event循环,结束程序
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <event2/event.h>
  7. #include <event2/bufferevent.h>
  8. #include <arpa/inet.h>
  9. void read_cb(struct bufferevent *bfev, void *args)
  10. {
  11. char buff[1024] = {0};
  12. int len = bufferevent_read(bfev, buff, sizeof(buff));
  13. printf("从服务器接收到了数据:%s", buff);
  14. bufferevent_free(bfev);
  15. }
  16. void write_cb(struct bufferevent *bfev, void *args)
  17. {
  18. printf("数据已发送");
  19. }
  20. void event_cb(struct bufferevent *bfev, short what, void *args)
  21. {
  22. if (what & BEV_EVENT_CONNECTED)
  23. {
  24. printf("连接建立完成\n");
  25. return;
  26. }
  27. if (what & BEV_EVENT_ERROR)
  28. {
  29. printf("出现错误事件\n");
  30. perror("");
  31. if (args != NULL)
  32. free(args);
  33. bufferevent_free(bfev);
  34. exit(1);
  35. }
  36. if (what & BEV_EVENT_EOF)
  37. {
  38. printf("连接已断开\n");
  39. if (args != NULL)
  40. free(args);
  41. bufferevent_free(bfev);
  42. exit(0);
  43. }
  44. }
  45. void std_cb(evutil_socket_t fd, short what, void *sock_bev)
  46. {
  47. char buff[1024] = {0};
  48. int len = read(fd, buff, sizeof(buff));
  49. struct bufferevent *bev = (struct bufferevent *)sock_bev;
  50. int code;
  51. code = bufferevent_write(bev, buff, strlen(buff) + 1);
  52. if (code == -1)
  53. {
  54. perror("write to buffer event error");
  55. exit(1);
  56. }
  57. }
  58. int main()
  59. {
  60. struct event_base *base = NULL;
  61. base = event_base_new();
  62. if (base == NULL)
  63. {
  64. perror("base new error");
  65. exit(1);
  66. }
  67. // 要连接的服务器信息
  68. struct sockaddr_in serv;
  69. memset(&serv, 0, sizeof(serv));
  70. serv.sin_family = AF_INET;
  71. serv.sin_port = htons(9999);
  72. inet_pton(AF_INET, "127.0.0.1", &serv.sin_addr.s_addr);
  73. // 创建套接字
  74. int fd = socket(AF_INET, SOCK_STREAM, 0);
  75. if (fd < 0)
  76. {
  77. perror("create socket erroe");
  78. exit(1);
  79. }
  80. printf("套接字创建完成\n");
  81. // 创建本次通信的bufferevent
  82. struct bufferevent *bev = NULL;
  83. bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
  84. int code;
  85. code = bufferevent_socket_connect(bev, (struct sockaddr *)&serv, sizeof(serv));
  86. if (code == -1)
  87. {
  88. perror("connect error");
  89. exit(1);
  90. }
  91. bufferevent_setcb(bev, read_cb, write_cb, event_cb, NULL);
  92. code = bufferevent_enable(bev, EV_READ | EV_WRITE);
  93. if (code == -1)
  94. {
  95. perror("enable error");
  96. exit(1);
  97. }
  98. // 创建std输入事件
  99. struct event *ev = NULL;
  100. ev = event_new(base, STDIN_FILENO, EV_READ, std_cb, (void *)bev);
  101. if (ev == NULL)
  102. {
  103. perror("创建std event error");
  104. exit(1);
  105. }
  106. code = event_add(ev, NULL);
  107. if (code == -1)
  108. {
  109. perror("event add error");
  110. exit(1);
  111. }
  112. // 开始运行
  113. code = event_base_dispatch(base);
  114. if (code == -1)
  115. {
  116. perror("dispatch error");
  117. exit(1);
  118. }
  119. //printf("event base start\n");
  120. event_base_free(base);
  121. printf("event base free\n");
  122. return 0;
  123. }