Advertisement
Tobiahao

S01_BSD_02_SERVER

Jan 23rd, 2018
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.11 KB | None | 0 0
  1. /*
  2. Napisz programy, które prześlą plik o rozmiarze większym od 1 MiB między
  3. dwoma komputerami, z użyciem protokołu TCP/IP. Sprawdź , co się stanie, jeśli
  4. plik będzie wysyłany w jednym komunikacie.
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <sys/socket.h>
  10. #include <sys/types.h>
  11. #include <arpa/inet.h>
  12. #include <unistd.h>
  13. #include <fcntl.h>
  14. #include <string.h>
  15.  
  16. #define FILENAME "received_file"
  17. #define SERVER_PORT 1919
  18. #define MAX_CLIENTS 5
  19.  
  20. void error_handler(const char *msg)
  21. {
  22.     perror(msg);
  23.     exit(EXIT_FAILURE);
  24. }
  25.  
  26. int main(void)
  27. {
  28.     int server_socket, client_socket;
  29.     struct sockaddr_in server_addr, client_addr;
  30.     socklen_t addrlen = sizeof(struct sockaddr);
  31.     int file_size, remain_data;
  32.     char buffer[BUFSIZ];
  33.     ssize_t length;
  34.     int fd;
  35.  
  36.     server_addr.sin_family = AF_INET;
  37.     server_addr.sin_port = htons(SERVER_PORT);
  38.     server_addr.sin_addr.s_addr = INADDR_ANY;
  39.     memset(server_addr.sin_zero, '\0', 8);
  40.  
  41.     if((server_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  42.         error_handler("socket");
  43.     if(bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1)
  44.         error_handler("bind");
  45.     if(listen(server_socket, MAX_CLIENTS) == -1)
  46.         error_handler("listen");
  47.    
  48.     printf("Oczekiwanie na polaczenie klienta...\n");
  49.  
  50.     if((client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &addrlen)) == -1)
  51.         error_handler("accept");
  52.  
  53.     printf("Klient polaczyl sie z serwerem!\n");
  54.  
  55.     if(recv(client_socket, buffer, BUFSIZ, 0) == -1)
  56.         error_handler("read");
  57.     file_size = atoi(buffer);
  58.    
  59.     printf("Odbieram plik o rozmiarze %d bajtow...\n", file_size);
  60.    
  61.     if((fd = open(FILENAME, O_RDWR | O_CREAT, 0755)) == -1)
  62.         error_handler("open");
  63.  
  64.     remain_data = file_size;
  65.    
  66.     memset(buffer, '\0', BUFSIZ);
  67.     while(((length = recv(client_socket, buffer, BUFSIZ, 0)) > 0) && (remain_data > 0)) {
  68.         if(write(fd, buffer, length) == -1)
  69.             error_handler("write");
  70.         remain_data -= length;
  71.     }
  72.  
  73.     if(length == -1)
  74.         error_handler("recv");
  75.  
  76.     printf("Pomyslnie odebrano plik!\n");
  77.  
  78.     if(close(server_socket) == -1)
  79.         error_handler("close");
  80.  
  81.     return EXIT_SUCCESS;
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement