Advertisement
Guest User

Untitled

a guest
Dec 17th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.98 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <unistd.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include <errno.h>
  6. #include <error.h>
  7. #include <netdb.h>
  8. #include <sys/epoll.h>
  9. #include <poll.h>
  10. #include <thread>
  11. #include <sys/epoll.h>
  12.  
  13. using namespace std;
  14.  
  15. ssize_t readData(int fd, char * buffer, ssize_t buffsize){
  16. auto ret = read(fd, buffer, buffsize);
  17. if(ret==-1) error(1,errno, "read failed on descriptor %d", fd);
  18. return ret;
  19. }
  20.  
  21. void writeData(int fd, char * buffer, ssize_t count){
  22. auto ret = write(fd, buffer, count);
  23. if(ret==-1) error(1, errno, "write failed on descriptor %d", fd);
  24. if(ret!=count) error(0, errno, "wrote less than requested to descriptor %d (%ld/%ld)", fd, count, ret);
  25. }
  26.  
  27. void reading(int sock) {
  28. while(true) {
  29. ssize_t bufsize1 = 255, received1;
  30. char buffer1[bufsize1];
  31. received1 = readData(sock, buffer1, bufsize1);
  32. writeData(1, buffer1, received1);
  33. }
  34. }
  35.  
  36. int main(int argc, char ** argv){
  37. if(argc!=3) error(1,0,"Need 2 args");
  38.  
  39. // Resolve arguments to IPv4 address with a port number
  40. addrinfo *resolved, hints={.ai_flags=0, .ai_family=AF_INET, .ai_socktype=SOCK_STREAM};
  41. int res = getaddrinfo(argv[1], argv[2], &hints, &resolved);
  42. if(res || !resolved) error(1, errno, "getaddrinfo");
  43.  
  44. // create socket
  45. int sock = socket(resolved->ai_family, resolved->ai_socktype, 0);
  46. if(sock == -1) error(1, errno, "socket failed");
  47.  
  48. // attept to connect
  49. res = connect(sock, resolved->ai_addr, resolved->ai_addrlen);
  50. if(res) error(1, errno, "connect failed");
  51.  
  52. // free memory
  53. freeaddrinfo(resolved);
  54.  
  55. ///****************************/
  56.  
  57.  
  58.  
  59.  
  60. ///****************************/
  61.  
  62.  
  63.  
  64. //working on epoll
  65. /****************************/
  66. ssize_t bufsize = 255;
  67. char buffer1[bufsize];
  68. int count;
  69.  
  70. int fd = epoll_create1(0);
  71.  
  72. epoll_event event;
  73. event.events = EPOLLIN;
  74. event.data.fd = sock;
  75.  
  76. epoll_ctl(fd, EPOLL_CTL_ADD, sock, &event);
  77. event.data.fd = 0;
  78. epoll_ctl(fd, EPOLL_CTL_ADD, 0, &event);
  79.  
  80.  
  81.  
  82. while(true) {
  83. int resultCount = epoll_wait(fd, &event, 1, -1);
  84.  
  85. if (event.events == EPOLLIN && event.data.fd == sock) {
  86. int rodeBytes = readData(sock, buffer1, bufsize);
  87. writeData(1, buffer1, rodeBytes);
  88. }
  89.  
  90. if (event.events == EPOLLIN && event.data.fd == 0) {
  91.  
  92. int rodeDataBytes = readData(0, buffer1, bufsize);
  93. writeData(sock, buffer1, rodeDataBytes);
  94. }
  95. }
  96.  
  97.  
  98. close(fd);
  99.  
  100. /****************************/
  101.  
  102.  
  103.  
  104. //working on pool
  105. /****************************/
  106. // ssize_t bufsize = 255;
  107. // char buffer1[bufsize];
  108. // int count;
  109. //
  110. // pollfd waitOn[5]{};
  111. // waitOn[0].fd = sock;
  112. // waitOn[0].events=POLLIN;
  113. // waitOn[1].fd = 0;
  114. // waitOn[1].events=POLLIN;
  115. //
  116. // while(true) {
  117. // int ready = poll(waitOn, 2, -1);
  118. //
  119. // for (pollfd & opis : waitOn) {
  120. // if (opis.revents == POLLIN) {
  121. // if (opis.fd == sock) {
  122. // count = read(opis.fd, buffer1, bufsize);
  123. // buffer1[count] = '\0';
  124. // write(1, buffer1, count);
  125. // } if(opis.fd == 0) {
  126. // int rodeDataBytes = read(0, buffer1, bufsize);
  127. // buffer1[rodeDataBytes] = '\0';
  128. // write(sock, buffer1, rodeDataBytes);
  129. // }
  130. // }
  131. // }
  132. // }
  133.  
  134. /****************************/
  135.  
  136. //working on threads
  137. /****************************/
  138.  
  139. // read from socket, write to stdout
  140. //thread t(reading, sock);
  141.  
  142. //while(true) {
  143. // read from stdin, write to socket
  144. //ssize_t bufsize2 = 255, received2;
  145. //char buffer2[bufsize2];
  146. //received2 = readData(0, buffer2, bufsize2);
  147. //writeData(sock, buffer2, received2);
  148. //}
  149.  
  150. /****************************/
  151.  
  152. close(sock);
  153.  
  154. return 0;
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement