From 98fa2be2126e5ca759a8f4a4e4d203eefd1aff3c Mon Sep 17 00:00:00 2001 From: Adrian Bondrescu Date: Sun, 20 May 2012 19:36:40 +0300 Subject: [PATCH] Add client and server for transmitting large files. --- test/Makefile | 10 ++++- test/client_lf.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++ test/server_lf.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 213 insertions(+), 1 deletion(-) create mode 100644 test/client_lf.c create mode 100644 test/server_lf.c diff --git a/test/Makefile b/test/Makefile index 92f7b02..e5848cd 100644 --- a/test/Makefile +++ b/test/Makefile @@ -1,12 +1,20 @@ CC=gcc CFLAGS=-g -build: client server +build: client server client_lf server_lf client: client.o server: server.o +client_lf: client_lf.o + +server_lf: server_lf.o + client.o: client.c server.o: server.c + +client_lf.o: client_lf.c + +server_lf.o: server_lf.c diff --git a/test/client_lf.c b/test/client_lf.c new file mode 100644 index 0000000..3ce1b56 --- /dev/null +++ b/test/client_lf.c @@ -0,0 +1,102 @@ +#include "../src/kernel/swift.h" + +#include +#include +#include +#include +#include +#include +#include + +#define ADDR 0x80BEA8C0 +#define DADDR 0x81BEA8C0 + +int main(int argc, const char *argv[]) +{ + int sock; + + sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_SWIFT); + if (sock < 0) { + perror("Failed to create socket"); + return -1; + } + + int size = sizeof(struct sockaddr_swift) + sizeof(struct swift_dest); + struct sockaddr_swift *saddr = malloc(size); + memset(saddr, 0, size); + + saddr->count = 1; + saddr->dests[0].addr = ADDR; + saddr->dests[0].port = 50; + + if (bind(sock, (struct sockaddr *) saddr, size) < 0) { + perror("Failed to bind socket"); + close(sock); + return -1; + } + + int fd = open("large_file", O_RDONLY); + if (fd < 0) { + perror("Failed to open file"); + close(sock); + return -1; + } + + char buf[8192]; + struct iovec iov[2]; + struct msghdr msg; + int size2 = sizeof(struct sockaddr_swift) + 2 * sizeof(struct swift_dest); + struct sockaddr_swift *to = malloc(size2); + + memset(&msg, 0, sizeof(msg)); + memset(&iov, 0, sizeof(iov)); + memset(to, 0, size2); + + iov[0].iov_base = buf; + iov[1].iov_base = buf; + + to->count = 2; + to->dests[0].addr = DADDR; + to->dests[0].port = 100; + to->dests[1].addr = DADDR; + to->dests[1].port = 101; + + msg.msg_iov = iov; + msg.msg_iovlen = 2; + msg.msg_name = to; + msg.msg_namelen = size2; + + while (1) { + int ret; + + ret = read(fd, buf, 8192, 0); + if (ret == 0) + break; + if (ret < 0) { + perror("Failed to read from file"); + return -1; + } + iov[0].iov_len = ret; + iov[1].iov_len = ret; + + ret = sendmsg(sock, &msg, sizeof(msg)); + if (ret < 0) { + perror("Failed to send on socket"); + return -1; + } + + printf("Sent %d bytes on socket\n", msg.msg_namelen); + } + + if (close(sock) < 0) { + perror("Failed to close socket"); + close(fd); + return -1; + } + + close(fd); + + free(saddr); + free(to); + return 0; +} diff --git a/test/server_lf.c b/test/server_lf.c new file mode 100644 index 0000000..1ec8a32 --- /dev/null +++ b/test/server_lf.c @@ -0,0 +1,102 @@ +#include "../src/kernel/swift.h" + +#include +#include +#include +#include +#include +#include +#include + +#define ADDR 0x80BEA8C0 + +int main(int argc, const char *argv[]) +{ + int sock; + + if (argc != 3) { + fprintf(stderr, "USAGE: %s listening_port output_file_name\n", argv[0]); + return -1; + } + + sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_SWIFT); + if (sock < 0) { + perror("Failed to create socket"); + return -1; + } + + int size = sizeof(struct sockaddr_swift) + sizeof(struct swift_dest); + struct sockaddr_swift *saddr = malloc(size); + memset(saddr, 0, size); + + saddr->count = 1; + saddr->dests[0].addr = ADDR; + saddr->dests[0].port = atoi(argv[1]); + + if (bind(sock, (struct sockaddr *) saddr, size) < 0) { + perror("Failed to bind socket"); + close(sock); + return -1; + } + + int fd = open(argv[2], O_RDWR); + if (fd < 0) { + perror("Failed to open file"); + close(sock); + return -1; + } + + char buf[8192]; + struct iovec iov[1]; + struct msghdr msg; + struct sockaddr_swift *from = malloc(size); + + memset(&msg, 0, sizeof(msg)); + memset(&iov, 0, sizeof(iov)); + memset(from, 0, size); + + iov[0].iov_base = buf; + iov[0].iov_len = sizeof(buf); + + msg.msg_iov = iov; + msg.msg_iovlen = 1; + msg.msg_name = from; + msg.msg_namelen = size; + + while (1) { + int ret, fromlen; + + ret = recvmsg(sock, &msg, 0); + if (ret < 0) { + perror("Failed to recv on socket"); + close(fd); + return -1; + } + + ret = write(fd, buf, ret, 0); + if (ret < 0) { + perror("Failed to write in file"); + close(fd); + return -1; + } + + printf("Received %d bytes on socket\n", ret); + printf("buf=%s\n", buf); + + if (ret < 8192) + break; + } + + if (close(sock) < 0) { + perror("Failed to close socket"); + close(fd); + return -1; + } + + close(fd); + + free(saddr); + free(from); + + return 0; +} -- 2.20.1