Advertisement
Tobiahao

S01_BSD_04_SERVER

Jan 23rd, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.88 KB | None | 0 0
  1. /*
  2. Napisz programy przesyłające plik o wielkości przekraczającej 1 MiB między
  3. dwoma komputerami, przy użyciu protokołu bezpołączeniowego.
  4. */
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <sys/types.h>
  9. #include <sys/stat.h>
  10. #include <sys/socket.h>
  11. #include <arpa/inet.h>
  12. #include <fcntl.h>
  13. #include <string.h>
  14. #include <unistd.h>
  15.  
  16. #define FILENAME "received_file"
  17. #define SERVER_PORT 1919
  18. #define END_FLAG "--END_OF_TRANSFER--"
  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 sockfd, filefd;
  29.     struct sockaddr_in sockaddr;
  30.     char buffer[BUFSIZ];
  31.     int remain_bytes;
  32.     ssize_t received_bytes;
  33.  
  34.     sockaddr.sin_family = AF_INET;
  35.     sockaddr.sin_port = htons(SERVER_PORT);
  36.     sockaddr.sin_addr.s_addr = INADDR_ANY;
  37.     memset(sockaddr.sin_zero, '\0', 8);
  38.  
  39.     if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
  40.         error_handler("socket");
  41.  
  42.     if(bind(sockfd, (struct sockaddr *)&sockaddr, sizeof(sockaddr)) == -1)
  43.         error_handler("bind");
  44.  
  45.     printf("Oczekiwanie na przeslanie pliku...\n");
  46.  
  47.     socklen_t socklen = sizeof(struct sockaddr);
  48.     if(recvfrom(sockfd, buffer, BUFSIZ, 0, (struct sockaddr *)&sockaddr, &socklen) == -1)
  49.         error_handler("recvfrom");
  50.     remain_bytes = atoi(buffer);
  51.  
  52.     printf("Przesylanie pliku o rozmiarze %d bajtow...\n", remain_bytes);
  53.  
  54.     if((filefd = open(FILENAME, O_RDWR | O_CREAT, 0755)) == -1)
  55.         error_handler("open");
  56.  
  57.     memset(buffer, '\0', BUFSIZ);
  58.  
  59.     for(;;) {
  60.         memset(buffer, '\0', BUFSIZ);
  61.         if((received_bytes = recvfrom(sockfd, buffer, BUFSIZ, 0, (struct sockaddr *)&sockaddr, &socklen)) == -1)
  62.             error_handler("recvfrom");
  63.        
  64.         if(!strcmp(END_FLAG, buffer))
  65.             break;
  66.         if(write(filefd, buffer, BUFSIZ) == -1)
  67.             error_handler("write");
  68.     }
  69.  
  70.     printf("Plik zostal odebrany!\n");
  71.  
  72.     if((close(sockfd) == -1) || ((close(filefd)) == -1))
  73.         error_handler("close");
  74.  
  75.     return EXIT_SUCCESS;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement