#include #include #include #include #include #include #include #include #include #define LENGTH 512 // Buffer length int main(int argc, char *argv[]) { int sockfd; char recvbuf[LENGTH]; struct sockaddr_in remote_addr; char *server; if(argc < 4){ printf("Too few arguments. \nUsage : myftpdc \n"); } server = argv[2]; int port = atoi(argv[3]); if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { printf("Socket creation failed!\n"); return (0); } remote_addr.sin_family = AF_INET; remote_addr.sin_port = htons(port); inet_pton(AF_INET, server, &remote_addr.sin_addr); if (connect(sockfd, (struct sockaddr *)&remote_addr, sizeof(struct sockaddr)) == -1) { printf ("Failed to connect to the host!\n"); return (0); } else printf("Connected ...!\n"); char* f_name = argv[1]; FILE *fp = fopen(f_name, "a"); if(fp == NULL) { printf("File %s cannot be opened. Check permissions\n", f_name); } else { bzero(recvbuf, LENGTH); int f_block_sz; while(f_block_sz = recv(sockfd, recvbuf, LENGTH, 0)) { int write_sz = fwrite(recvbuf, sizeof(char), f_block_sz, fp); if(write_sz < f_block_sz) { printf("File write failed.\n"); break; } if(f_block_sz < 0) { printf("Receive file error.\n"); break; } else if(f_block_sz = 0){ printf("No more data. Closing connection.\n"); break; } bzero(recvbuf, LENGTH); } } close (sockfd); printf("Connection ended.\n"); return (0); }