sendfile: added testing server
[p2p-kernel-protocol.git] / sendfile / server / server.c
diff --git a/sendfile/server/server.c b/sendfile/server/server.c
new file mode 100644 (file)
index 0000000..8bc0ff0
--- /dev/null
@@ -0,0 +1,87 @@
+#include <netinet/in.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <netdb.h>
+#include <stdio.h>
+
+#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 <peer_ip> <peer_port> <file_name>\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;
+}