Advertisement
Guest User

Untitled

a guest
May 23rd, 2015
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.94 KB | None | 0 0
  1. // This file is used to test epoll in multiple processes environment
  2. //
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <unistd.h>
  8.  
  9. #include <sys/types.h>
  10. #include <sys/socket.h>
  11. #include <sys/epoll.h>
  12. #include <netinet/in.h>
  13. #include <arpa/inet.h>
  14.  
  15. static const char* host;
  16. static int port;
  17.  
  18. struct context {
  19. int fd;
  20. };
  21.  
  22. struct context ctx;
  23.  
  24. int create_listening() {
  25. int fd = socket(AF_INET, SOCK_STREAM, 0);
  26. struct sockaddr_in sockaddr;
  27. int optval = 1;
  28. socklen_t socklen;
  29. if (fd < 0) {
  30. perror("socket failed: ");
  31. goto fail;
  32. }
  33. setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
  34.  
  35. socklen = sizeof(sockaddr);
  36. memset(&sockaddr, 0, socklen);
  37. sockaddr.sin_family = AF_INET;
  38. sockaddr.sin_port = htons(port);
  39. sockaddr.sin_addr.s_addr = INADDR_ANY;
  40.  
  41. if (bind(fd, (struct sockaddr*)&sockaddr, socklen)) {
  42. perror("bind failed: ");
  43. goto fail;
  44. }
  45.  
  46. if (listen(fd, 1024)) {
  47. perror("listen failed: ");
  48. goto fail;
  49. }
  50.  
  51. ctx.fd = fd;
  52.  
  53. return 0;
  54. fail:
  55. if (fd >= 0) {
  56. close(fd);
  57. }
  58. return 1;
  59. }
  60.  
  61. int ep_fd = -1;
  62. int create_epoll() {
  63. ep_fd = epoll_create(10);
  64. if (ep_fd < 0) {
  65. perror("epoll create failed: ");
  66. goto fail;
  67. }
  68. return ep_fd;
  69.  
  70. fail:
  71. if (ep_fd >= 0) {
  72. close(ep_fd);
  73. ep_fd = -1;
  74. }
  75. return -1;
  76. }
  77.  
  78. void handler(int fd) {
  79. close(fd);
  80. }
  81.  
  82. void worker_process() {
  83. struct epoll_event ev;
  84.  
  85. // listen
  86. if (create_listening()) {
  87. fprintf(stderr, "create listening failed.\n");
  88. return;
  89. }
  90. ev.events = EPOLLIN;
  91. ev.data.fd = ctx.fd;
  92. if (epoll_ctl(ep_fd, EPOLL_CTL_ADD, ctx.fd, &ev)) {
  93. perror("epoll control add event failed: ");
  94. return;
  95. }
  96. fprintf(stderr, "Child: goto sleep.\n");
  97. while (1) {
  98. sleep(100);
  99. }
  100. }
  101.  
  102. void master_worker() {
  103. int i = 0;
  104. pid_t self_pid = getpid();
  105. fprintf(stderr, "Master: create epoll fd.\n");
  106. create_epoll();
  107. fprintf(stderr, "Master: create children process.\n");
  108. pid_t pid = fork();
  109. switch (pid) {
  110. case 0:
  111. worker_process();
  112. return;
  113. case -1:
  114. perror("create child failed:");
  115. break;
  116. default:
  117. break;
  118. }
  119. fprintf(stderr, "master wait epoll.\n");
  120. while (1) {
  121. struct epoll_event events[5];
  122. int num_event = epoll_wait(ep_fd, events, 5, 5000);
  123. if (num_event > 0) {
  124. int i = 0;
  125. for (; i < num_event; ++i) {
  126. if (events[i].events & EPOLLIN) {
  127. printf("recevie event in fd is %d\n", events[i].data.fd);
  128. int client_fd = accept(events[i].data.fd, NULL, NULL);
  129. if (client_fd < 0) {
  130. fprintf(stderr, "%d accept failed.\n", self_pid);
  131. } else {
  132. fprintf(stderr, "%d recevie epoll in event.\n", self_pid);
  133. handler(client_fd);
  134. }
  135. } else if (events[i].events & EPOLLERR) {
  136. fprintf(stderr, "%d recevie epoll err event.\n", self_pid);
  137. } else {
  138. fprintf(stderr, "%d recevie epoll unknown event.\n", self_pid);
  139. }
  140. }
  141. } else if (num_event < 0) {
  142. perror("epoll wait failed");
  143. } else {
  144. printf("no events.num_event=%d\n", num_event);
  145. }
  146. }
  147. }
  148.  
  149. int create_master() {
  150. master_worker();
  151. }
  152.  
  153. void print_help() {
  154. fprintf(stderr, "usage\n");
  155. fprintf(stderr, "\t./a.out host port\n");
  156. fprintf(stderr, "example\n");
  157. fprintf(stderr, "\t./a.out 127.0.0.1 54321\n");
  158. }
  159.  
  160. int main(int argc, char* argv[]) {
  161. if (argc != 3) {
  162. print_help();
  163. return 1;
  164. }
  165.  
  166. // Get argument information.
  167. host = argv[1];
  168. port = atoi(argv[2]);
  169. printf("host is %s and port is %d\n", host, port);
  170.  
  171. // create master
  172. create_master();
  173.  
  174. return 0;
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement