X-Git-Url: http://p2p-next.cs.pub.ro/gitweb/?a=blobdiff_plain;ds=sidebyside;f=sendfile%2Fserver%2Fserver.c;fp=sendfile%2Fserver%2Fserver.c;h=8bc0ff0b321845bcfd859a075f501dd09cf59dbf;hb=03eb49a78a2b1edcea84fe7f3f21ceab50ee8b37;hp=0000000000000000000000000000000000000000;hpb=b5fd47dcb6af4b842455c2f6fb2b0fc58704f08c;p=p2p-kernel-protocol.git 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; +}