Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <netdb.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <sys/socket.h>
- #include <errno.h>
- int main(int argc, char *argv[])
- {
- errno = 0;
- enum
- {
- UDP = 17,
- SIZE = 1024,
- ERROR = -1,
- SUCCESS = 0
- };
- struct
- {
- int exchange_socket;
- int port;
- char *server_name;
- struct hostent *server_ip;
- // internet format
- struct sockaddr_in server_addr;
- socklen_t server_addrlen;
- } info;
- info.server_addrlen = sizeof(info.server_addr);
- putchar('\n');
- puts("[ Host name to connect: ]");
- fflush(stdin);
- char buffer[SIZE];
- fscanf(stdin, "%512s[^\n]", buffer);
- // string allocating
- if (NULL == (info.server_name = strndup(buffer, strlen(buffer))))
- {
- perror("strndup");
- exit(1);
- }
- memset(buffer, 0, SIZE);
- puts("[ Host port to connect: ]");
- fflush(stdin);
- while (1)
- {
- int flag = scanf("%d", &info.port);
- if ('\r' == getchar())
- break;
- if (flag > 0)
- break;
- }
- errno = 0;
- if (ERROR == (info.exchange_socket = socket(AF_INET, SOCK_DGRAM, UDP)))
- {
- perror("socket");
- exit(1);
- }
- perror("socket");
- if (NULL == (info.server_ip = gethostbyname(info.server_name)))
- {
- herror("gethostbyname");
- shutdown(info.exchange_socket, SHUT_RDWR);
- close(info.exchange_socket);
- exit(1);
- }
- herror("gethostbyname");
- memset(&info.server_addr, 0, sizeof(info.server_addr));
- info.server_addr.sin_family = AF_INET;
- info.server_addr.sin_port = htons(info.port);
- memcpy(&info.server_addr.sin_addr.s_addr, info.server_ip->h_addr, info.server_ip->h_length);
- while (1)
- {
- sendto(info.exchange_socket, "Ping\r\n", strlen("Ping\r\n"), 0, (struct sockaddr *) &info.server_addr, info.server_addrlen);
- memset(buffer, 0, SIZE);
- recvfrom(info.exchange_socket, buffer, SIZE-1, 0, (struct sockaddr *) &info.server_addr, &info.server_addrlen);
- if (strstr(buffer, "Pong\r\n"))
- {
- memset(buffer, 0, SIZE);
- break;
- }
- else
- memset(buffer, 0, SIZE);
- }
- puts("Path to save file:");
- fflush(stdin);
- fscanf(stdin, "%512s[^\n]", buffer);
- FILE *file = 0;
- if (file = fopen(buffer, "w"))
- perror("fopen");
- else
- {
- perror("fopen");
- shutdown(info.exchange_socket, SHUT_RDWR);
- close(info.exchange_socket);
- exit(1);
- }
- if (ERROR == chmod(buffer, S_IRUSR|S_IWUSR|S_IXUSR))
- {
- perror("chmod");
- fclose(file);
- shutdown(info.exchange_socket, SHUT_RDWR);
- close(info.exchange_socket);
- exit(1);
- }
- perror("chmod");
- memset(buffer, 0, SIZE);
- /* if (setvbuf(file, buffer, _IONBF, SIZE) != SUCCESS)
- {
- perror("setvbuf");
- fclose(file);
- shutdown(info.exchange_socket, SHUT_RDWR);
- close(info.exchange_socket);
- exit(1);
- }
- perror("setvbuf");
- */
- while (1)
- {
- sendto(info.exchange_socket, "Ping\r\n", strlen("Ping\r\n"), 0, (struct sockaddr *) &info.server_addr, info.server_addrlen);
- memset(buffer, 0, SIZE);
- recvfrom(info.exchange_socket, buffer, SIZE-1, 0, (struct sockaddr *) &info.server_addr, &info.server_addrlen);
- if (strstr(buffer, "Pong\r\n"))
- {
- memset(buffer, 0, SIZE);
- break;
- }
- else
- memset(buffer, 0, SIZE);
- }
- puts("\n--- File receiving ---");
- ssize_t current_size = 0;
- ssize_t received_bytes = 0;
- while ((received_bytes = recvfrom(info.exchange_socket, buffer, SIZE-1, 0, (struct sockaddr *) &info.server_addr, &info.server_addrlen)) > 0)
- {
- fwrite(buffer, sizeof(buffer[0]), received_bytes, file);
- current_size += received_bytes;
- fprintf(stderr, "[%d] %s", current_size, buffer);
- memset(buffer, 0, SIZE);
- }
- printf("Received bytes: %d", current_size);
- puts("\n--- EOF ---\n");
- fclose(file);
- shutdown(info.exchange_socket, SHUT_RDWR);
- close(info.exchange_socket);
- putchar('\n');
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement