#include #include #include #include #include #include #include #include int main(int argc, char **argv) { int sock; int ret; unsigned int fsize; unsigned int count = 0; unsigned int prev; unsigned short port = 5000; char fname[128]; char cfsize[12]; char buf[65536]; FILE* outf; struct sockaddr_in addr; if (argc != 3) { fprintf(stderr, "Usage: %s IP_addr filename\n", argv[0]); exit(1); } memset(&addr, 0, sizeof(addr)); ret = inet_aton(argv[1], &addr.sin_addr); if (!ret) { fprintf(stderr, "invalid IP address %s\n", argv[1]); exit(1); } ret = sscanf(argv[2], "%s", fname); if (ret != 1) { fprintf(stderr, "filename error"); exit(1); } addr.sin_family = AF_INET; addr.sin_port = htons(port); sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock == -1) { perror("socket()"); exit(1); } ret = connect(sock, (struct sockaddr *)&addr, sizeof(addr)); if (ret == -1) { perror("connect()"); fprintf(stderr, "connection failed\n"); exit(1); } fprintf(stderr, "connected...\n"); /* send the filename to the server */ ret = send(sock, fname, strlen(fname), 0); if (ret == -1) { perror("send()"); fprintf(stderr, "send failed\n"); exit(1); } /* get the file size back from the server */ ret = recv(sock, cfsize, sizeof(cfsize), 0); if (ret == -1) { perror("recv()"); fprintf(stderr, "recv failed\n"); exit(1); } fsize = atoi(cfsize); fprintf(stderr, "file size is %d bytes\n", fsize); /* open the output file */ outf = fopen(fname, "w"); if (!outf) { perror("fopen()"); fprintf(stderr, "file open failed\n"); } /* receive the incoming data and write it to the output file */ while (count < fsize) { ret = recv(sock, buf, sizeof(buf), MSG_DONTWAIT); if (ret == -1) { perror("recv()"); fprintf(stderr, "recv failed\n"); } if (ret > 0) { fwrite(buf, sizeof(char), (size_t) ret, outf); fprintf(stderr, "received %d bytes\n", ret); } prev = count; count += ret; if (prev == count) { fprintf(stderr, "error: expected %d, received %d\n", fsize, count); exit(1); } } fclose(outf); exit(0); }