Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Napisz programy przesyłające plik o wielkości przekraczającej 1 MiB między
- dwoma komputerami, przy użyciu protokołu bezpołączeniowego.
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <sys/stat.h>
- #include <arpa/inet.h>
- #include <netinet/in.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <string.h>
- #define SERVER_PORT 1919
- #define SERVER_IP "127.0.0.1"
- #define END_FLAG "--END_OF_TRANSFER--"
- void error_handler(const char *msg)
- {
- perror(msg);
- exit(EXIT_SUCCESS);
- }
- int main(int argc, char *argv[])
- {
- if(argc != 2) {
- fprintf(stderr, "Niepoprawna liczba argumentow!\nUzycie: %s [plik, ktory ma zostac wyslany]\n", argv[0]);
- return EXIT_FAILURE;
- }
- int sockfd, filefd;
- struct sockaddr_in sockaddr;
- struct stat file_stat;
- int remain_bytes;
- ssize_t sent_bytes;
- char buffer[BUFSIZ];
- if(!inet_aton(SERVER_IP, &sockaddr.sin_addr))
- error_handler("inet_aton");
- sockaddr.sin_family = AF_INET;
- sockaddr.sin_port = htons(SERVER_PORT);
- memset(sockaddr.sin_zero, '\0', 8);
- if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
- error_handler("socket");
- if((filefd = open(argv[1], O_RDONLY)) == -1)
- error_handler("open");
- if(fstat(filefd, &file_stat) == -1)
- error_handler("stat");
- remain_bytes = file_stat.st_size;
- sprintf(buffer, "%d", remain_bytes);
- if(sendto(sockfd, buffer, BUFSIZ, 0, (struct sockaddr *)&sockaddr, sizeof(sockaddr)) == -1)
- error_handler("sendto");
- printf("Wysylam plik o rozmiarze %d bajtow...\n", remain_bytes);
- memset(buffer, '\0', BUFSIZ);
- while((sent_bytes = read(filefd, buffer, BUFSIZ)) > 0)
- if(sendto(sockfd, buffer, sent_bytes, 0, (struct sockaddr *)&sockaddr, sizeof(sockaddr)) == -1)
- error_handler("sendto");
- if(sendto(sockfd, END_FLAG, strlen(END_FLAG), 0, (struct sockaddr *)&sockaddr, sizeof(sockaddr)) == -1)
- error_handler("sendto");
- printf("Plik zostal wyslany!\n");
- if((close(sockfd) == -1) || (close(filefd) == -1))
- error_handler("close");
- return EXIT_SUCCESS;
- }
Add Comment
Please, Sign In to add comment