Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.47 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <arpa/inet.h>
  7.  
  8. #include <sys/types.h>
  9. #include <sys/stat.h>
  10.  
  11. #include <dirent.h>
  12.  
  13. void ProcessClientConnection(int clientSocket)
  14. {
  15.     //tworzenie listy plików
  16.     //max 256 wpisów po 256 znaków
  17.     char files[256][256];
  18.  
  19.     //licznik plików w folderze
  20.     int fileCounter = 0;
  21.  
  22.     //struktura do listowania elementów w katalogu
  23.     struct dirent* dirEntry;
  24.  
  25.     //otwieram wybrany kataloga
  26.     DIR* directory = opendir("."); 
  27.  
  28.     //po udanym otwarciu katalogu pobiera info o plikach
  29.     if (directory)
  30.     {
  31.         while ((dirEntry = readdir(directory)) != NULL)
  32.         {
  33.             //warunek sprawdzająca czy element nie jest katalogiem
  34.             if (dirEntry->d_type != DT_DIR)
  35.             {
  36.                 printf("%s\n", dirEntry->d_name);
  37.  
  38.                 //kopia nazwy pliku do listy elementów
  39.                 strcpy(files[fileCounter], dirEntry->d_name);
  40.                 fileCounter++;
  41.             }
  42.         }
  43.  
  44.         //zamknięcie katalogu
  45.         closedir(directory);
  46.     }
  47.  
  48.     //rzutowanie wartości z liością plików na format sieciowy
  49.     long dl_ilscoPlikow = htonl((long)fileCounter);
  50.  
  51.     //warunek wysyłania ilości plików do klienta
  52.     if (send(clientSocket, &dl_ilscoPlikow, sizeof(long), 0) != sizeof(long))
  53.     {
  54.         printf("Amount of files can not be transfer\n");
  55.         return;
  56.     }
  57.  
  58.     //wysłanie wszystkich nazw plików do klienta
  59.     int i = 0;
  60.     for (i = 0; i < fileCounter; i++)
  61.     {
  62.         //fukcja przesyłu danych
  63.         send(clientSocket, files[i], 256, 0); //strlen(files[i])
  64.     }
  65.  
  66.    
  67. }
  68. //zmiena dla pliku wybranego przez klienta
  69. int ProcessDownload(int clientSocket){
  70.     char filename[256];
  71.  
  72.     //fukcja wyzerowania zmiennej z nazwą pliku
  73.     memset(filename, 0, 256);
  74.     //tworzenie struktury niezbędnej do pobrania informacji o pliku
  75.     struct stat fileinfo;
  76.  
  77. // pętal wyboru i pobierania pliku
  78. while (1)
  79. {
  80.  
  81.     //pobranie nazwy pliku od klienta
  82.     if (recv(clientSocket, filename, 256, 0) <= 0)
  83.     {
  84.         printf("Invalid path\n");
  85.         return 0;
  86.     }
  87.  
  88.     printf("Chosen file is %s\n", filename);
  89.  
  90.  
  91.  
  92.     //pobranie informacji o pliku
  93.     if (stat(filename, &fileinfo) < 0)
  94.     {
  95.         printf("File information can not be transfer\n");
  96.        
  97.         //wysłanie na serwer informacji o pliku
  98.         long fileSize = htonl((long)0);
  99.  
  100.         //wysłanie do klienta wielkości pliku
  101.         if(send(clientSocket, &fileSize, sizeof(long), 0) != sizeof(long))
  102.         {
  103.             printf("Size of the file can not be trasfer\n");
  104.             continue;
  105.         }
  106.        
  107.         continue;
  108.     }
  109.  
  110.     //jeżeli wielkość pliku to 0
  111.     if (fileinfo.st_size == 0)
  112.     {
  113.         printf("Size of the file = 0\n");
  114.  
  115.         //wysłanie na serwer informacji
  116.         long fileSize = htonl((long)0);
  117.  
  118.         //wysłanie do klienta wielkości pliku
  119.         if(send(clientSocket, &fileSize, sizeof(long), 0) != sizeof(long))
  120.         {
  121.             printf("Size of the file can not be trasfer\n");
  122.             continue;
  123.         }
  124.  
  125.         continue;
  126.     }
  127.     if (fileinfo.st_size != 0){
  128.         break;
  129.     }
  130. }
  131.     printf("Size of the file = %d\n", fileinfo.st_size);
  132.  
  133.     //rzutowanie wielkości pliku na format sieciowy
  134.     long fileSize = htonl((long)fileinfo.st_size);
  135.  
  136.     //warunek wysłania do klienta wielkości pliku
  137.     if (send(clientSocket, &fileSize, sizeof(long), 0) != sizeof(long))
  138.     {
  139.         printf("Size of the file can not be trasfer\n");
  140.         return 1;
  141.     }
  142.  
  143.     //ponowne przypisanie normalnej wartości wielkości pliku
  144.     fileSize = fileinfo.st_size;
  145.  
  146.     //suma danych jaka została wysłana do klienta
  147.     long sendSummary = 0;
  148.  
  149.     //ilość danych jaka została odczytana z pliku
  150.     long fileReadSize = 0;
  151.  
  152.     //ilość danych jaka została wysłana do klienta w jednej paczce
  153.     long sendSize = 0;
  154.  
  155.     //otwarcie pliku w trybie binarnym
  156.     FILE* plik = fopen(filename, "rb");
  157.  
  158.     //fukcja kończąca nieudane otwarcie
  159.     if (plik == NULL)
  160.     {
  161.         printf("File can not be open\n");
  162.         return 1;
  163.     }
  164.  
  165.     //tworzenie buforu danych do wysyłania
  166.     unsigned char bufor[1024];
  167.  
  168.     //czytanie danych z pliku i wysyłamy
  169.     while (sendSummary < fileSize)
  170.     {
  171.         //pobranie danych z pliku
  172.         fileReadSize = fread(bufor, 1, 1024, plik);
  173.  
  174.         //wysłanie ich do klienta
  175.         sendSize = send(clientSocket, bufor, fileReadSize, 0);
  176.  
  177.         //sprawdzenie czy ilość przeczytanych oraz wysłanych danych sie zgadza
  178.         if (fileReadSize != sendSize)
  179.             break;
  180.  
  181.         //suma wysyłanych danych
  182.         sendSummary += sendSize;
  183.         printf("%d bytes were sent\n", sendSummary);
  184.     }
  185.  
  186.     //zamknięcie pliku
  187.     fclose(plik);
  188.  
  189.     if (sendSummary == fileSize)
  190.         printf("File sent correctly\n");
  191.     else
  192.         printf("!! File sent incorrectly !!\n");
  193. }
  194.  
  195. // fukcja main start
  196. int main(int argc, char *argv[])
  197. {
  198.     unsigned int port;
  199.     int serverSocket, clientSocket;
  200.     struct sockaddr_in serverSocketAddress;
  201.     socklen_t addressSize = sizeof(struct sockaddr_in);
  202.  
  203.     printf("Which port would you prefer? : ");
  204.     scanf("%u", &port);
  205.     //utworzenie nowego socketa nasłuchującego
  206.     serverSocket = socket(PF_INET, SOCK_STREAM, 0);
  207.  
  208.     //ustawienia dla socketa po stronie serwera
  209.     serverSocketAddress.sin_family = AF_INET;
  210.     serverSocketAddress.sin_port = htons(port);
  211.     serverSocketAddress.sin_addr.s_addr = INADDR_ANY;
  212.  
  213.     //jeżeli możliwe używamy tego samego adresu socketa jeżeli był już w użyciu
  214.     /*int opt_val = 1;
  215.     setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, &opt_val, sizeof opt_val);*/
  216.  
  217.     //wyzerowanie wartości
  218.     memset(serverSocketAddress.sin_zero, 0, sizeof(serverSocketAddress.sin_zero));
  219.  
  220.     //przypisanie ustawień do socketa serwera
  221.     if (bind(serverSocket, (struct sockaddr*)&serverSocketAddress, addressSize) < 0)
  222.     {
  223.         printf("Binding error\n");
  224.         return 1;
  225.     }
  226.  
  227.     //rozpoczęcie nasłuchu na sockecie serwera
  228.     listen(serverSocket, 10);
  229.  
  230.     while (1)
  231.     {
  232.         addressSize = sizeof(struct sockaddr_in);
  233.  
  234.         //oczekiwanie na podłączenie się klienta
  235.         clientSocket = accept(serverSocket, (struct sockaddr*)&serverSocketAddress, &addressSize);
  236.  
  237.         if (clientSocket < 0)
  238.         {
  239.             printf("Accept error\n");
  240.             continue;
  241.         }
  242.  
  243.         printf("Connection from %s:%u\n", inet_ntoa(serverSocketAddress.sin_addr), ntohs(serverSocketAddress.sin_port));
  244.         printf("Creating a child process\n");
  245.        
  246.         //tworzenie procesu potomnego do obsługi komunikacja z klientem
  247.         if (fork() == 0)
  248.         {
  249.             // proces potomny zaczyna działać
  250.             printf("Start operating\n");
  251.  
  252.             //obsłóga klienta
  253.             ProcessClientConnection(clientSocket);
  254.             int warunek = 1;
  255.             while (warunek) {          
  256.             warunek = ProcessDownload(clientSocket);
  257.             }
  258.            
  259.  
  260.            
  261.         }
  262.         else
  263.         {
  264.             // ponowne rozpoczęcie nasłuchu  
  265.             printf("Listening\n");
  266.         }
  267.     }
  268.     return 0;
  269. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement