Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.45 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <netdb.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <fcntl.h>
  8. #include <sys/socket.h>
  9. #include <errno.h>
  10.  
  11. int main(int argc, char *argv[])
  12. {
  13.  
  14.     errno = 0;
  15.  
  16.     enum
  17.     {
  18.         UDP = 17,
  19.         SIZE = 1024,
  20.         ERROR = -1,
  21.         SUCCESS = 0
  22.     };
  23.  
  24.     struct
  25.     {
  26.         int exchange_socket;
  27.         int port;
  28.         char *server_name;
  29.         struct hostent *server_ip;
  30.         // internet format
  31.         struct sockaddr_in server_addr;
  32.         socklen_t server_addrlen;
  33.     } info;
  34.  
  35.     info.server_addrlen = sizeof(info.server_addr);
  36.  
  37.     putchar('\n');
  38.    
  39.     puts("[ Host name to connect: ]");
  40.     fflush(stdin);
  41.     char buffer[SIZE];
  42.     fscanf(stdin, "%512s[^\n]", buffer);
  43.     // string allocating
  44.     if (NULL == (info.server_name = strndup(buffer, strlen(buffer))))
  45.     {
  46.         perror("strndup");
  47.         exit(1);
  48.     }
  49.    
  50.     memset(buffer, 0, SIZE);
  51.    
  52.     puts("[ Host port to connect: ]");
  53.     fflush(stdin);
  54.     while (1)
  55.     {
  56.         int flag = scanf("%d", &info.port);
  57.         if ('\r' == getchar())
  58.             break;
  59.         if (flag > 0)
  60.             break;
  61.     }
  62.  
  63.     errno = 0;
  64.     if (ERROR == (info.exchange_socket = socket(AF_INET, SOCK_DGRAM, UDP)))
  65.     {
  66.         perror("socket");
  67.         exit(1);
  68.     }
  69.     perror("socket");
  70.  
  71.     if (NULL == (info.server_ip = gethostbyname(info.server_name)))
  72.     {
  73.         herror("gethostbyname");
  74.         shutdown(info.exchange_socket, SHUT_RDWR);
  75.         close(info.exchange_socket);
  76.         exit(1);
  77.     }
  78.     herror("gethostbyname");
  79.  
  80.     memset(&info.server_addr, 0, sizeof(info.server_addr));
  81.     info.server_addr.sin_family = AF_INET;
  82.     info.server_addr.sin_port = htons(info.port);
  83.     memcpy(&info.server_addr.sin_addr.s_addr, info.server_ip->h_addr, info.server_ip->h_length);
  84.  
  85.     while (1)
  86.     {
  87.         sendto(info.exchange_socket, "Ping\r\n", strlen("Ping\r\n"), 0, (struct sockaddr *) &info.server_addr,  info.server_addrlen);
  88.         memset(buffer, 0, SIZE);
  89.         recvfrom(info.exchange_socket, buffer, SIZE-1, 0, (struct sockaddr *) &info.server_addr, &info.server_addrlen);
  90.        
  91.         if (strstr(buffer, "Pong\r\n"))
  92.         {
  93.             memset(buffer, 0, SIZE);
  94.             break;
  95.         }
  96.         else
  97.             memset(buffer, 0, SIZE);
  98.     }
  99.  
  100.     puts("Path to save file:");
  101.     fflush(stdin);
  102.     fscanf(stdin, "%512s[^\n]", buffer);
  103.    
  104.     FILE *file = 0;
  105.     if (file = fopen(buffer, "w"))
  106.         perror("fopen");
  107.     else
  108.     {
  109.         perror("fopen");
  110.         shutdown(info.exchange_socket, SHUT_RDWR);
  111.         close(info.exchange_socket);
  112.         exit(1);
  113.     }
  114.  
  115.     if (ERROR == chmod(buffer, S_IRUSR|S_IWUSR|S_IXUSR))
  116.     {
  117.         perror("chmod");
  118.         fclose(file);
  119.         shutdown(info.exchange_socket, SHUT_RDWR);
  120.         close(info.exchange_socket);
  121.         exit(1);
  122.     }
  123.     perror("chmod");
  124.     memset(buffer, 0, SIZE);
  125.  
  126.  /*   if (setvbuf(file, buffer, _IONBF, SIZE) != SUCCESS)
  127.     {
  128.         perror("setvbuf");
  129.         fclose(file);
  130.         shutdown(info.exchange_socket, SHUT_RDWR);
  131.         close(info.exchange_socket);
  132.         exit(1);
  133.     }
  134.     perror("setvbuf");
  135. */
  136.     while (1)
  137.     {
  138.         sendto(info.exchange_socket, "Ping\r\n", strlen("Ping\r\n"), 0, (struct sockaddr *) &info.server_addr,  info.server_addrlen);
  139.         memset(buffer, 0, SIZE);
  140.         recvfrom(info.exchange_socket, buffer, SIZE-1, 0, (struct sockaddr *) &info.server_addr, &info.server_addrlen);
  141.        
  142.         if (strstr(buffer, "Pong\r\n"))
  143.         {
  144.             memset(buffer, 0, SIZE);
  145.             break;
  146.         }
  147.         else
  148.             memset(buffer, 0, SIZE);
  149.     }
  150.  
  151.     puts("\n--- File receiving ---");
  152.  
  153.     ssize_t current_size = 0;
  154.     ssize_t received_bytes = 0;
  155.  
  156.     while ((received_bytes = recvfrom(info.exchange_socket, buffer, SIZE-1, 0, (struct sockaddr *) &info.server_addr, &info.server_addrlen)) > 0)
  157.     {
  158.         fwrite(buffer, sizeof(buffer[0]), received_bytes, file);
  159.         current_size += received_bytes;
  160.        
  161.         fprintf(stderr, "[%d] %s", current_size, buffer);
  162.  
  163.         memset(buffer, 0, SIZE);
  164.     }
  165.  
  166.     printf("Received bytes: %d", current_size);
  167.     puts("\n--- EOF ---\n");
  168.  
  169.     fclose(file);
  170.    
  171.     shutdown(info.exchange_socket, SHUT_RDWR);
  172.     close(info.exchange_socket);
  173.    
  174.     putchar('\n');
  175.  
  176.     return 0;
  177. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement