Advertisement
tomasaccini

Untitled

Jul 19th, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.69 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <string.h>
  7. #include <arpa/inet.h>
  8. #include <stdio.h>
  9. #include <netinet/in.h>
  10.  
  11. int conectar_socket(const char* ip, const char* port) {
  12.     struct addrinfo* socketinfo;
  13.     getaddrinfo(ip, port, NULL, socketinfo);
  14.     // Asumo que la primera conexión es válida.
  15.     int skt = socket(socketinfo->ai_family, socketinfo->ai_socktype, socketinfo->ai_protocol);
  16.     connect(skt, socketinfo->ai_addr, socketinfo->ai_addrlen);
  17.     freeaddrinfo(socketinfo);
  18.     return skt;
  19. }
  20.  
  21. size_t obtener_largo_archivo(FILE* f) {
  22.     size_t largo = 0;
  23.     while (fgetc(f) != EOF) {
  24.         ++largo;
  25.     }
  26.     fseek(f, 0, SEEK_SET);
  27.     return largo;
  28. }
  29.  
  30. int enviar_por_socket(int skt, char* buf, int tam) {
  31.     int enviados = 0;
  32.     int enviado_ultimo;
  33.     while (enviados < tam) {
  34.         enviado_ultimo = send(skt, buf, tam - enviados);
  35.         if (enviado_ultimo <= 0) return -1;
  36.         enviados += recibido_ultimo;
  37.     }
  38.     return enviados;
  39. }
  40.  
  41. int main(int argc, char* argv[]) {
  42.     int skt = conectar_socket(argv[1], argv[2]);
  43.     FILE* f = fopen(argv[3], "r");
  44.     if (!f) return -1;
  45.     size_t largo = obtener_largo_archivo(f);
  46.     size_t enviados = 0;
  47.     char buf[256];
  48.     while (enviados < largo) {
  49.         size_t leidos = fread(buf, 256, 1, f);
  50.         size_t enviados_ultimo = enviar_por_socket(skt, &buf[0], leidos);
  51.         if (enviados_ultimo != leidos) break;
  52.         enviados += enviados_ultimo;
  53.     }
  54.     enviar_por_socket(skt, "\0", 1); // Caracter que indica que finalizo el envio.
  55.     fclose(f);
  56.     shutdown(skt, SHUT_RDWE);
  57.     close(skt);
  58.     return 0;
  59. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement