From 03eb49a78a2b1edcea84fe7f3f21ceab50ee8b37 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C4=83zvan=20Crainea?= Date: Sat, 2 Jun 2012 13:31:49 +0300 Subject: [PATCH] sendfile: added testing server --- sendfile/server/Makefile | 7 ++++ sendfile/server/server.c | 87 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 sendfile/server/Makefile create mode 100644 sendfile/server/server.c diff --git a/sendfile/server/Makefile b/sendfile/server/Makefile new file mode 100644 index 0000000..b52084b --- /dev/null +++ b/sendfile/server/Makefile @@ -0,0 +1,7 @@ +FILE=server + +$(FILE):$(FILE).o + +.PHONY: clean +clean: + -rm -rf $(FILE) $(FILE).o diff --git a/sendfile/server/server.c b/sendfile/server/server.c new file mode 100644 index 0000000..8bc0ff0 --- /dev/null +++ b/sendfile/server/server.c @@ -0,0 +1,87 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define BUFFER_SIZE 256 + +int main(int argc, char **argv) +{ + int sock, err, file_fd; + ssize_t ret, len, offset, bytes_to_write; + struct sockaddr_in psin; + struct hostent *host; + char buffer[BUFFER_SIZE]; + + if (argc != 4) { + fprintf(stderr, "Usage: %s \n", argv[0]); + return -1; + } + + printf("Opening AF_INET socket\n"); + + /* first open the file descriptor */ + file_fd = open(argv[3], O_CREAT|O_WRONLY|O_TRUNC, 0644); + if (file_fd < 0) { + printf("Cannot open file for write\n"); + return -1; + } + printf("Opened file for write %s[%d]\n", argv[3], file_fd); + + sock = socket(AF_INET, SOCK_DGRAM, 0); + printf("Socket returned: %d\n", sock); + + if (sock < 0) { + printf("Cannot create AF_INET socket: %s(%d)\n", + strerror(errno), errno); + return -1; + } + printf("Successfully created AF_INET socket: %d\n", sock); + + host = gethostbyname(argv[1]); + psin.sin_family = AF_INET; + psin.sin_port = htons(atoi(argv[2])); + psin.sin_addr = *((struct in_addr *)host->h_addr); + + if (bind(sock, (struct sockaddr *)&psin, + sizeof(struct sockaddr_in)) == -1) { + printf("Cannot bind to server: %s(%d)\n", strerror(errno), errno); + return -1; + } + + printf("Bound to: %s:%s\n", argv[1], argv[2]); + + for (;;) { + ret = read(sock, buffer, BUFFER_SIZE); + if (ret < 0) { + printf("Error while receiving file %s: %s(%d)\n", argv[0], + strerror(errno), errno); + return err; + } else if (ret == 0) { + break; + } + bytes_to_write = ret; + offset = 0; + do { + len = write(file_fd, buffer+offset, bytes_to_write); + if (len < 0) { + printf("Error while receiving file %s: %s(%d)\n", argv[0], + strerror(errno), errno); + return -1; + } + bytes_to_write -= len; + offset += len; + } while (bytes_to_write > 0); + if (ret < BUFFER_SIZE) + break; + } + + printf("Successfully read file %s\n", argv[0]); + + return 0; +} -- 2.20.1