Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <dirent.h>
- void ProcessClientConnection(int clientSocket)
- {
- //tworzenie listy plików
- //max 256 wpisów po 256 znaków
- char files[256][256];
- //licznik plików w folderze
- int fileCounter = 0;
- //struktura do listowania elementów w katalogu
- struct dirent* dirEntry;
- //otwieram wybrany kataloga
- DIR* directory = opendir(".");
- //po udanym otwarciu katalogu pobiera info o plikach
- if (directory)
- {
- while ((dirEntry = readdir(directory)) != NULL)
- {
- //warunek sprawdzająca czy element nie jest katalogiem
- if (dirEntry->d_type != DT_DIR)
- {
- printf("%s\n", dirEntry->d_name);
- //kopia nazwy pliku do listy elementów
- strcpy(files[fileCounter], dirEntry->d_name);
- fileCounter++;
- }
- }
- //zamknięcie katalogu
- closedir(directory);
- }
- //rzutowanie wartości z liością plików na format sieciowy
- long dl_ilscoPlikow = htonl((long)fileCounter);
- //warunek wysyłania ilości plików do klienta
- if (send(clientSocket, &dl_ilscoPlikow, sizeof(long), 0) != sizeof(long))
- {
- printf("Amount of files can not be transfer\n");
- return;
- }
- //wysłanie wszystkich nazw plików do klienta
- int i = 0;
- for (i = 0; i < fileCounter; i++)
- {
- //fukcja przesyłu danych
- send(clientSocket, files[i], 256, 0); //strlen(files[i])
- }
- }
- //zmiena dla pliku wybranego przez klienta
- int ProcessDownload(int clientSocket){
- char filename[256];
- //fukcja wyzerowania zmiennej z nazwą pliku
- memset(filename, 0, 256);
- //tworzenie struktury niezbędnej do pobrania informacji o pliku
- struct stat fileinfo;
- // pętal wyboru i pobierania pliku
- while (1)
- {
- //pobranie nazwy pliku od klienta
- if (recv(clientSocket, filename, 256, 0) <= 0)
- {
- printf("Invalid path\n");
- return 0;
- }
- printf("Chosen file is %s\n", filename);
- //pobranie informacji o pliku
- if (stat(filename, &fileinfo) < 0)
- {
- printf("File information can not be transfer\n");
- //wysłanie na serwer informacji o pliku
- long fileSize = htonl((long)0);
- //wysłanie do klienta wielkości pliku
- if(send(clientSocket, &fileSize, sizeof(long), 0) != sizeof(long))
- {
- printf("Size of the file can not be trasfer\n");
- continue;
- }
- continue;
- }
- //jeżeli wielkość pliku to 0
- if (fileinfo.st_size == 0)
- {
- printf("Size of the file = 0\n");
- //wysłanie na serwer informacji
- long fileSize = htonl((long)0);
- //wysłanie do klienta wielkości pliku
- if(send(clientSocket, &fileSize, sizeof(long), 0) != sizeof(long))
- {
- printf("Size of the file can not be trasfer\n");
- continue;
- }
- continue;
- }
- if (fileinfo.st_size != 0){
- break;
- }
- }
- printf("Size of the file = %d\n", fileinfo.st_size);
- //rzutowanie wielkości pliku na format sieciowy
- long fileSize = htonl((long)fileinfo.st_size);
- //warunek wysłania do klienta wielkości pliku
- if (send(clientSocket, &fileSize, sizeof(long), 0) != sizeof(long))
- {
- printf("Size of the file can not be trasfer\n");
- return 1;
- }
- //ponowne przypisanie normalnej wartości wielkości pliku
- fileSize = fileinfo.st_size;
- //suma danych jaka została wysłana do klienta
- long sendSummary = 0;
- //ilość danych jaka została odczytana z pliku
- long fileReadSize = 0;
- //ilość danych jaka została wysłana do klienta w jednej paczce
- long sendSize = 0;
- //otwarcie pliku w trybie binarnym
- FILE* plik = fopen(filename, "rb");
- //fukcja kończąca nieudane otwarcie
- if (plik == NULL)
- {
- printf("File can not be open\n");
- return 1;
- }
- //tworzenie buforu danych do wysyłania
- unsigned char bufor[1024];
- //czytanie danych z pliku i wysyłamy
- while (sendSummary < fileSize)
- {
- //pobranie danych z pliku
- fileReadSize = fread(bufor, 1, 1024, plik);
- //wysłanie ich do klienta
- sendSize = send(clientSocket, bufor, fileReadSize, 0);
- //sprawdzenie czy ilość przeczytanych oraz wysłanych danych sie zgadza
- if (fileReadSize != sendSize)
- break;
- //suma wysyłanych danych
- sendSummary += sendSize;
- printf("%d bytes were sent\n", sendSummary);
- }
- //zamknięcie pliku
- fclose(plik);
- if (sendSummary == fileSize)
- printf("File sent correctly\n");
- else
- printf("!! File sent incorrectly !!\n");
- }
- // fukcja main start
- int main(int argc, char *argv[])
- {
- unsigned int port;
- int serverSocket, clientSocket;
- struct sockaddr_in serverSocketAddress;
- socklen_t addressSize = sizeof(struct sockaddr_in);
- printf("Which port would you prefer? : ");
- scanf("%u", &port);
- //utworzenie nowego socketa nasłuchującego
- serverSocket = socket(PF_INET, SOCK_STREAM, 0);
- //ustawienia dla socketa po stronie serwera
- serverSocketAddress.sin_family = AF_INET;
- serverSocketAddress.sin_port = htons(port);
- serverSocketAddress.sin_addr.s_addr = INADDR_ANY;
- //jeżeli możliwe używamy tego samego adresu socketa jeżeli był już w użyciu
- /*int opt_val = 1;
- setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, &opt_val, sizeof opt_val);*/
- //wyzerowanie wartości
- memset(serverSocketAddress.sin_zero, 0, sizeof(serverSocketAddress.sin_zero));
- //przypisanie ustawień do socketa serwera
- if (bind(serverSocket, (struct sockaddr*)&serverSocketAddress, addressSize) < 0)
- {
- printf("Binding error\n");
- return 1;
- }
- //rozpoczęcie nasłuchu na sockecie serwera
- listen(serverSocket, 10);
- while (1)
- {
- addressSize = sizeof(struct sockaddr_in);
- //oczekiwanie na podłączenie się klienta
- clientSocket = accept(serverSocket, (struct sockaddr*)&serverSocketAddress, &addressSize);
- if (clientSocket < 0)
- {
- printf("Accept error\n");
- continue;
- }
- printf("Connection from %s:%u\n", inet_ntoa(serverSocketAddress.sin_addr), ntohs(serverSocketAddress.sin_port));
- printf("Creating a child process\n");
- //tworzenie procesu potomnego do obsługi komunikacja z klientem
- if (fork() == 0)
- {
- // proces potomny zaczyna działać
- printf("Start operating\n");
- //obsłóga klienta
- ProcessClientConnection(clientSocket);
- int warunek = 1;
- while (warunek) {
- warunek = ProcessDownload(clientSocket);
- }
- }
- else
- {
- // ponowne rozpoczęcie nasłuchu
- printf("Listening\n");
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement