#include #include #include #include #include #include #include #include #include #include #include #include int main(int argc, char **argv) { int sock; int ret; int desc; int fd; int len; unsigned short port = 5000; char fname[128]; char fsize[12]; off_t offset = 0; struct sockaddr_in addr; struct sockaddr_in addr2; struct stat stat_buf; sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == -1) { perror("socket()"); fprintf(stderr, "socket failed\n"); exit(1); } memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons(port); ret = bind(sock, (struct sockaddr *) &addr, sizeof(addr)); if (ret) { perror("bind()"); fprintf(stderr, "bind socket failed\n"); exit(1); } /* listen for client */ ret = listen(sock, 1); if (ret) { perror("listen()"); fprintf(stderr, "listen failed\n"); exit(1); } while (1) { len = sizeof(struct sockaddr); desc = accept(sock, (struct sockaddr *) &addr2, &len); if (desc == -1) { perror("accept()"); fprintf(stderr, "accept failed\n"); exit(1); } /* get the file name from the client and open it */ ret = recv(desc, fname, sizeof(fname), 0); if (ret == -1) { perror("recv()"); fprintf(stderr, "recv failed\n"); exit(1); } fname[ret] = '\0'; fd = open(fname, O_RDONLY); if (fd == -1) { perror("open()"); fprintf(stderr, "unable to open '%s'\n", fname); exit(1); } /* get the size of the file and tell the client */ fstat(fd, &stat_buf); sprintf(fsize, "%d", stat_buf.st_size); ret = send(desc, fsize, strlen(fsize), 0); if (ret == -1) { perror("send()"); fprintf(stderr, "send failed\n"); exit(1); } fprintf(stderr, "sending file '%s' size %d bytes\n", fname, stat_buf.st_size); /* send the file */ offset = 0; ret = sendfile(desc, fd, &offset, stat_buf.st_size); if (ret == -1) { perror("sendfile()"); fprintf(stderr, "sendfile failed\n"); exit(1); } fprintf(stderr, "%d bytes sent\n", ret); /* did the whole file get sent? */ if (ret != stat_buf.st_size) { fprintf(stderr, "error: %d of %d bytes transferred\n", ret, (int) stat_buf.st_size); exit(1); } close(fd); close(desc); } close(sock); exit(0); }