Advertisement
Guest User

Untitled

a guest
May 20th, 2018
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.37 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <netdb.h>
  7. #include <unistd.h>
  8. #include <fcntl.h>
  9. #include <sys/epoll.h>
  10. #include <errno.h>
  11. #include <string.h>
  12.  
  13. #define MAXEVENTS 64
  14.  
  15. void setnonblocking(int fd) {
  16. int flag = fcntl(fd, F_GETFL, 0);
  17. fcntl(fd, F_SETFL, flag|O_NONBLOCK);
  18. }
  19.  
  20. int main () {
  21. int listening;
  22. struct sockaddr_in server;
  23.  
  24. listening = socket(AF_INET , SOCK_STREAM , 0);
  25. if (listening == -1)
  26. {
  27. printf("Could not create socket");
  28. }
  29.  
  30. int s;
  31.  
  32. server.sin_family = AF_INET;
  33. server.sin_addr.s_addr = INADDR_ANY;
  34. server.sin_port = htons( 8888 );
  35.  
  36. if( bind(listening,(struct sockaddr *)&server , sizeof(server)) < 0)
  37. {
  38. puts("bind failed");
  39. }
  40. listen(listening, SOMAXCONN);
  41.  
  42. int efd;
  43. struct epoll_event event;
  44. struct epoll_event *events;
  45.  
  46. efd = epoll_create1(0);
  47. if (efd == -1) {
  48. puts("epoll_create failed");
  49. }
  50.  
  51. event.data.fd = listening;
  52. event.events = EPOLLIN | EPOLLOUT;
  53. s = epoll_ctl(efd, EPOLL_CTL_ADD, listening, &event);
  54. if (s == -1) {
  55. puts("epoll_ctl failed");
  56. }
  57.  
  58. events = calloc(MAXEVENTS, sizeof event);
  59.  
  60. while (1) {
  61. int socketCount = epoll_wait(efd, events, MAXEVENTS, -1);
  62. if (socketCount == -1) {
  63. perror("epoll_pwait");
  64. exit(1);
  65. }
  66. for (int i = 0; i < socketCount; i++) {
  67. if ((events[i].events & EPOLLERR) ||
  68. (events[i].events & EPOLLHUP) ||
  69. (!(events[i].events & EPOLLIN))) {
  70. fprintf(stderr, "epoll error\n");
  71. close(events[i].data.fd);
  72. continue;
  73. }
  74. else if (events[i].data.fd == listening) {
  75. int client = accept(listening, NULL, NULL);
  76. //If any clients
  77. if (client == -1) {
  78. if ((errno == EAGAIN) ||
  79. (errno == EWOULDBLOCK)) {
  80. break;
  81. }
  82. else {
  83. puts("accept failed");
  84. break;
  85. }
  86. }
  87. //Add to epoll
  88. setnonblocking(client);
  89. event.events = EPOLLIN | EPOLLET;
  90. event.data.fd = client;
  91. if (epoll_ctl(efd, EPOLL_CTL_ADD, client, &event) == -1) {
  92. perror("epoll_ctl");
  93. exit(1);
  94. }
  95. char* message = "Welcome!\r\n";
  96. write(client, message, strlen(message));
  97. }
  98. else {
  99. ssize_t count;
  100. char buf[512];
  101.  
  102. count = read(events[i].data.fd, buf, sizeof buf);
  103. if (count == -1) {
  104. perror("read");
  105. exit(1);
  106. }
  107.  
  108. struct epoll_event *events_to;
  109. int n = epoll_wait(efd, events_to, MAXEVENTS, -1);
  110. for (int j = 0; j < n; j++) {
  111. if (events_to[j].data.fd != listening) {
  112. write(events_to[j].data.fd, buf, count);
  113. }
  114. }
  115. }
  116. }
  117. }
  118.  
  119. listen(listening, SOMAXCONN);
  120.  
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement