Advertisement
Guest User

send.c

a guest
Apr 23rd, 2025
49
0
315 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.02 KB | Source Code | 0 0
  1. #include <arpa/inet.h>
  2. #include <stdint.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <unistd.h>
  7.  
  8. int main(int argc, char *argv[]) {
  9.   if (argc < 2) {
  10.     perror("No file was inputed");
  11.     return EXIT_FAILURE;
  12.   }
  13.   const int PORT = 8080;
  14.   const int BUFFER_SIZE = 4096;
  15.  
  16.   struct sockaddr_in server_addr;
  17.   char buffer[BUFFER_SIZE];
  18.  
  19.   int sock = socket(AF_INET, SOCK_STREAM, 0);
  20.   if (sock < 0) {
  21.     perror("Socket failed");
  22.     exit(EXIT_FAILURE);
  23.   }
  24.  
  25.   server_addr.sin_family = AF_INET;
  26.   server_addr.sin_port = htons(PORT);
  27.   inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);
  28.  
  29.   if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr))) {
  30.     perror("Connection failed");
  31.     exit(EXIT_FAILURE);
  32.   }
  33.  
  34.   printf("Connected to server.\n");
  35.   FILE *files[argc - 1];
  36.   for (int i = 0; i < argc - 1; i++) {
  37.     files[i] = fopen(argv[i + 1], "rb");
  38.     if (files[i] == NULL) {
  39.       for (int j = 0; j < i; j++) {
  40.         fclose(files[j]);
  41.       }
  42.       close(sock);
  43.       perror("Error when opening file");
  44.       return EXIT_FAILURE;
  45.     }
  46.   }
  47.   uint32_t argc_buffer = htonl(argc - 1);
  48.   printf("%zu file(s) will be sent.\n", (unsigned long)argc - 1);
  49.   write(sock, &argc_buffer, sizeof(argc_buffer));
  50.   for (int i = 1; i < argc; i++) {
  51.     memset(buffer, 0, BUFFER_SIZE);
  52.     strcpy(buffer, argv[i]);
  53.     write(sock, buffer, BUFFER_SIZE);
  54.   }
  55.   int pos = 0;
  56.   while (pos < argc - 1) {
  57.  
  58.     memset(buffer, 0, BUFFER_SIZE);
  59.     int bytes_read = fread(buffer, sizeof(char), BUFFER_SIZE, files[pos]);
  60.     if (bytes_read < BUFFER_SIZE) {
  61.       if (feof(files[pos])) {
  62.         printf("Sending file %d: %s\n", pos + 1, argv[pos + 1]);
  63.         fclose(files[pos]);
  64.         pos++;
  65.       } else {
  66.         perror("File reading error");
  67.         for (int i = 0; i < argc - 1; i++) {
  68.           fclose(files[i]);
  69.         }
  70.         close(sock);
  71.         return EXIT_FAILURE;
  72.       }
  73.     }
  74.     write(sock, buffer, bytes_read);
  75.   }
  76.  
  77.   close(sock);
  78.   return 0;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement