Advertisement
Guest User

Untitled

a guest
Dec 7th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.92 KB | None | 0 0
  1. #include "sender.h"
  2. #include "converter.h"
  3.  
  4. int main(int argc, char *argv[])
  5. {
  6.     if (argc < 4)
  7.     {
  8.         printf("usage: %s file payload_size forwarders(host:port)\n", argv[0]);
  9.         return -1;
  10.     }
  11.  
  12.     char *file_path = argv[1];
  13.  
  14.     FILE *pFile = fopen(file_path, "rb");
  15.     if (!pFile)
  16.     {
  17.         printf("error: can't find the file\n");
  18.         return -1;
  19.     }
  20.  
  21.     unsigned int payload_size = atol(argv[2]);
  22.     unsigned int file_size = get_file_size(pFile);
  23.  
  24.     printf("File size %i bytes.\n", file_size);
  25.  
  26.     unsigned int buffer_size = HEADER_SIZE + payload_size;
  27.  
  28.     // Creando buffer ¿estático?
  29.     char *buffer = malloc(buffer_size);
  30.     memset(buffer, 0, buffer_size);
  31.  
  32.     // Campos del header
  33.     int header_segment_size = HEADER_SIZE / 3;
  34.  
  35.     char offset_header[header_segment_size];
  36.     char file_size_header[header_segment_size];
  37.     char payload_size_header[header_segment_size];
  38.  
  39.     // Llenamos los segmentos del header con los datos que correspondan
  40.     unsigned int offset = 0;
  41.  
  42.     // Guardamos los datos para el header en nuestro formato especial de 4 bytes
  43.     convert_to_4_bytes(offset, offset_header);
  44.     convert_to_4_bytes(file_size, file_size_header);
  45.     convert_to_4_bytes(payload_size, payload_size_header);
  46.  
  47.     // Insertamos los segmentos en el buffer
  48.     for(int i = 0; i < header_segment_size; i++){
  49.         buffer[i] = offset_header[i];
  50.         buffer[i + 4] = file_size_header[i];
  51.         buffer[i + 8] = payload_size_header[i];
  52.     }
  53.  
  54.     // Guardar todos los forwarder
  55.     int number_forwarders = argc - 3;
  56.     printf("#Forwarders: %i\n", number_forwarders);
  57.  
  58.     forwarder forwarders[number_forwarders];
  59.  
  60.     for (int i = 0; i < number_forwarders; i++)
  61.     {
  62.         get_host_and_port_from_string(argv[i + 3], &forwarders[i]);
  63.     }
  64.  
  65.     int number_of_packets = 0;
  66.  
  67.     // Empezar a enviar
  68.     int total_bytes_sent = 0;
  69.     while (total_bytes_sent < file_size)
  70.     {
  71.         for (int i = 0; i < number_forwarders; i++)
  72.         {
  73.             forwarder frw = forwarders[i];
  74.             printf("Sending to %s:%i\n", frw.host, frw.port);
  75.  
  76.             struct sockaddr_in stSockAddr;
  77.             int Res;
  78.             int SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  79.  
  80.             if (-1 == SocketFD)
  81.             {
  82.                 perror("cannot create socket");
  83.                 exit(EXIT_FAILURE);
  84.             }
  85.  
  86.             memset(&stSockAddr, 0, sizeof(struct sockaddr_in));
  87.  
  88.             stSockAddr.sin_family = AF_INET;
  89.             stSockAddr.sin_port = htons(frw.port);
  90.             Res = inet_pton(AF_INET, frw.host, &stSockAddr.sin_addr);
  91.  
  92.             if (0 > Res)
  93.             {
  94.                 perror("error: first parameter is not a valid address family");
  95.                 close(SocketFD);
  96.                 exit(EXIT_FAILURE);
  97.             }
  98.             else if (0 == Res)
  99.             {
  100.                 perror("char string (second parameter does not contain valid ipaddress");
  101.                 close(SocketFD);
  102.                 exit(EXIT_FAILURE);
  103.             }
  104.  
  105.             if (-1 == connect(SocketFD, (const struct sockaddr *)&stSockAddr, sizeof(struct sockaddr_in)))
  106.             {
  107.                 perror("connect failed");
  108.                 close(SocketFD);
  109.                 exit(EXIT_FAILURE);
  110.             }
  111.  
  112.             // Actualizamos el tamaño del paquete
  113.             if (payload_size > file_size - total_bytes_sent)
  114.             {
  115.                 payload_size = file_size - total_bytes_sent;
  116.                 printf("Updating fragment size to %i...\n", payload_size);
  117.  
  118.                 buffer_size = HEADER_SIZE + payload_size;
  119.  
  120.                 convert_to_4_bytes(payload_size, payload_size_header);
  121.                 for(int i = 0; i < header_segment_size; i++)
  122.                     buffer[i + 8] = payload_size_header[i];
  123.             }
  124.  
  125.             printf("Trying to send %i Bytes to %s:%d...\n", buffer_size, frw.host, frw.port);
  126.  
  127.             int total_bytes_sent_from_fragment = 0;
  128.  
  129.             get_buffer(&buffer, payload_size, pFile, file_size, total_bytes_sent);
  130.  
  131.             while (total_bytes_sent_from_fragment < buffer_size)
  132.             {
  133.                 int actBytesSent = send(SocketFD, buffer, buffer_size, 0);
  134.  
  135.                 total_bytes_sent_from_fragment += actBytesSent;
  136.             }
  137.  
  138.             total_bytes_sent += total_bytes_sent_from_fragment - HEADER_SIZE;
  139.  
  140.             // Actualizamos el offset
  141.             offset += total_bytes_sent_from_fragment - HEADER_SIZE;
  142.  
  143.             convert_to_4_bytes(offset, offset_header);
  144.             for(int i = 0; i < header_segment_size; i++){
  145.                 buffer[i] = offset_header[i];
  146.             }
  147.  
  148.             double percentage = ((double)total_bytes_sent / file_size) * 100;
  149.             printf("Total bytes sent: %d  %f percent\n", total_bytes_sent, percentage);
  150.  
  151.             shutdown(SocketFD, SHUT_RDWR);
  152.             close(SocketFD);
  153.  
  154.             printf("%i. Done by now!\n", ++number_of_packets);
  155.         }
  156.     }
  157.  
  158.     printf("File sending completed\n");
  159.  
  160.     free(buffer);
  161.     fclose(pFile);
  162.  
  163.     return 0;
  164. }
  165.  
  166. long get_file_size(FILE *pFile)
  167. {
  168.     fseek(pFile, 0, SEEK_END);
  169.     return ftell(pFile);
  170. }
  171.  
  172. int get_buffer(char **buffer, int bufferSize, FILE *pFile, int file_size, int total_bytes_sent)
  173. {
  174.     int actBufferSize = min(file_size - total_bytes_sent, bufferSize);
  175.     fseek(pFile, total_bytes_sent, SEEK_SET);
  176.     fread(*buffer + HEADER_SIZE, sizeof(char), actBufferSize, pFile);
  177.     return actBufferSize;
  178. }
  179.  
  180. int min(int a, int b)
  181. {
  182.     if (a > b)
  183.         return b;
  184.  
  185.     return a;
  186. }
  187.  
  188. void get_host_and_port_from_string(char *arg, forwarder *frw)
  189. {
  190.     const char delim[] = ":";
  191.  
  192.     // La función strtok permite separar un string en varios tokens con un delimitador
  193.     frw->host = strtok(arg, delim);
  194.  
  195.     // Con el parámetro null indicamos que queremos el siguiente token
  196.     frw->port = atoi(strtok(NULL, delim));
  197. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement