diff options
Diffstat (limited to 'src/client/client.bak')
-rw-r--r-- | src/client/client.bak | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/client/client.bak b/src/client/client.bak new file mode 100644 index 0000000..bacfa52 --- /dev/null +++ b/src/client/client.bak @@ -0,0 +1,75 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <netdb.h> +#include <arpa/inet.h> +#include <unistd.h> + +#include <math.h> + +#include "../include/types.h" + +#define FILE_SIZE 721127424 + +int main(int argc, char *argv[]) +{ + struct sockaddr_in server; + unsigned long addr; + int sock; + + // Create socket + sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (sock < 0) + { + printf("ERROR: Socket failure\n"); + return EXIT_FAILURE; + } + + addr = inet_addr(HOST); + memcpy((char *) &server.sin_addr, &addr, sizeof(addr)); + server.sin_family = AF_INET; // IPv4 + server.sin_port = htons(PORT); // set port number + + // Connect to server + if (connect(sock, (struct sockaddr*) &server, sizeof(server)) < 0) + { + printf("ERROR: Connect failure\n"); + return EXIT_FAILURE; + } + + // Set data + struct dnbd3_request request; + struct dnbd3_reply reply; + request.num = 0; + + // Send to server + int i; + off_t blocks = FILE_SIZE / DNBD3_BLOCK_SIZE; + int e = log(DNBD3_BLOCK_SIZE) / log(2); // logarithmus dualis + + + for (i = 0; i < blocks; i++) + { + request.num = i << e; // multiplie by e + send(sock, (char *) &request, sizeof(request), 0); + recv(sock, &reply, DNBD3_BLOCK_SIZE, MSG_WAITALL); + write(STDOUT_FILENO, reply.data, DNBD3_BLOCK_SIZE); + } + + /* Fetch "rest" bytes */ + int rest = FILE_SIZE % DNBD3_BLOCK_SIZE; + if (rest != 0) + { + request.num = i * DNBD3_BLOCK_SIZE; + send(sock, (char *) &request, sizeof(request), 0); + recv(sock, &reply, sizeof(struct dnbd3_reply), MSG_WAITALL); + write(STDOUT_FILENO, reply.data, rest); + } + + close(sock); + return EXIT_SUCCESS; +} |