EternalHaru

Untitled

May 28th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.42 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>
  4. #include <queue>
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. #include <string.h>
  8. #include <unistd.h>
  9. #include <time.h>
  10. #include <string.h>
  11. #include <unordered_map>
  12. #include <sys/un.h>
  13. #include <arpa/inet.h>
  14. #ifndef SOCK_NONBLOCK
  15.  #include <fcntl.h>
  16.  # define SOCK_NONBLOCK O_NONBLOCK
  17. #endif
  18.  
  19. using namespace std;
  20.  
  21. struct client;
  22. bool flag;
  23. int socket_for_server; //socket_id -> socket_for_server
  24. sockaddr_in address;// sockaddr_in self_addr -> address
  25. timespec tm;
  26.  
  27.  
  28. void *data_reception(void *args){ //функция приема данных из сокета
  29.     while (flag) {
  30.         char buffer[64];
  31.         memset(buffer, 0, 64);
  32.         int byte_received = 0;
  33.         while ((byte_received = recv(socket_for_server, buffer, 64, 0)) <= 0) {
  34.             if (byte_received == 0) {
  35.                 flag = false;
  36.                 pthread_exit(NULL);
  37.             }
  38.             if (!flag) {
  39.                 pthread_exit(NULL);
  40.             }
  41.             nanosleep(&tm, NULL);
  42.         }
  43.         printf("%s", buffer);
  44.         fflush(stdout);
  45.     }
  46. }
  47.  
  48. void *data_transfer (void *args) { // функция передачи данных в сокет; func_send -> data_transfer
  49.     fd_set readfs;
  50.     int fd_stdin = fileno(stdin);
  51.     timeval tv;
  52.     while (flag) {
  53.         char buffer[64];
  54.         memset(buffer, 0, 64);
  55.         while (true) {
  56.             tv.tv_sec = 0;
  57.             tv.tv_usec = 100000;
  58.             FD_ZERO(&readfs);
  59.             FD_SET(fd_stdin, &readfs);
  60.             int res = select(fd_stdin + 1, &readfs, NULL, NULL, &tv);
  61.             if (res > 0)
  62.             {
  63.                 scanf("%s", buffer);
  64.                 break;
  65.             }
  66.             if (!flag)
  67.                 pthread_exit(NULL);
  68.         }
  69.         if (strcmp(buffer, "exit") == 0)
  70.         {
  71.             flag = false;
  72.             pthread_exit(NULL);
  73.         }
  74.         send(socket_for_server, buffer, strlen(buffer), 0);
  75.         sleep(1);
  76.     }
  77. }
  78.    
  79. int main()
  80. {
  81.     flag = true;
  82.     tm.tv_sec = 0;
  83.     tm.tv_nsec = 10000000;
  84.  
  85.     address.sin_family = AF_INET;
  86.     address.sin_port = htons(31337);
  87.     inet_pton(AF_INET, "127.0.0.1", &(address.sin_addr));
  88.     socket_for_server = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
  89.    
  90.     perror("socket()");
  91.     printf("Wait connection\n");
  92.  
  93.     fd_set readfs; //дескриптор файла
  94.     int fd_stdin = fileno(stdin);
  95.     timeval tv;
  96.  
  97.     while (connect(socket_for_server, (struct sockaddr *)&address, sizeof(struct sockaddr)) == -1) {
  98.         FD_ZERO(&readfs);
  99.         FD_SET(fd_stdin, &readfs);
  100.         tv.tv_sec = 0;
  101.         tv.tv_usec = 100000;
  102.         int res = select(fd_stdin + 1, &readfs, NULL, NULL, &tv);
  103.         if (res > 0) {
  104.             char c;
  105.             scanf("%c", &c);            
  106.             shutdown(socket_for_server, SHUT_WR);
  107.             close(socket_for_server);
  108.             return 0;
  109.         }
  110.     }
  111.  
  112.     printf("Connection successfull!\n");
  113.  
  114.  
  115.     pthread_t thread_transfer, thread_reception;
  116.     pthread_create(&thread_transfer, NULL, &data_transfer, NULL);
  117.     pthread_create(&thread_reception, NULL, &data_reception, NULL);
  118.    
  119.     pthread_join(thread_transfer, NULL);
  120.     pthread_join(thread_reception, NULL);
  121.  
  122.     shutdown(socket_for_server, SHUT_WR);
  123.     close(socket_for_server);
  124.     printf("Client close\n");
  125.     return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment