Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <arpa/inet.h>
- #include <stdint.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- int main(int argc, char *argv[]) {
- if (argc < 2) {
- perror("No file was inputed");
- return EXIT_FAILURE;
- }
- const int PORT = 8080;
- const int BUFFER_SIZE = 4096;
- struct sockaddr_in server_addr;
- char buffer[BUFFER_SIZE];
- int sock = socket(AF_INET, SOCK_STREAM, 0);
- if (sock < 0) {
- perror("Socket failed");
- exit(EXIT_FAILURE);
- }
- server_addr.sin_family = AF_INET;
- server_addr.sin_port = htons(PORT);
- inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);
- if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr))) {
- perror("Connection failed");
- exit(EXIT_FAILURE);
- }
- printf("Connected to server.\n");
- FILE *files[argc - 1];
- for (int i = 0; i < argc - 1; i++) {
- files[i] = fopen(argv[i + 1], "rb");
- if (files[i] == NULL) {
- for (int j = 0; j < i; j++) {
- fclose(files[j]);
- }
- close(sock);
- perror("Error when opening file");
- return EXIT_FAILURE;
- }
- }
- uint32_t argc_buffer = htonl(argc - 1);
- printf("%zu file(s) will be sent.\n", (unsigned long)argc - 1);
- write(sock, &argc_buffer, sizeof(argc_buffer));
- for (int i = 1; i < argc; i++) {
- memset(buffer, 0, BUFFER_SIZE);
- strcpy(buffer, argv[i]);
- write(sock, buffer, BUFFER_SIZE);
- }
- int pos = 0;
- while (pos < argc - 1) {
- memset(buffer, 0, BUFFER_SIZE);
- int bytes_read = fread(buffer, sizeof(char), BUFFER_SIZE, files[pos]);
- if (bytes_read < BUFFER_SIZE) {
- if (feof(files[pos])) {
- printf("Sending file %d: %s\n", pos + 1, argv[pos + 1]);
- fclose(files[pos]);
- pos++;
- } else {
- perror("File reading error");
- for (int i = 0; i < argc - 1; i++) {
- fclose(files[i]);
- }
- close(sock);
- return EXIT_FAILURE;
- }
- }
- write(sock, buffer, bytes_read);
- }
- close(sock);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement