#include #include #include #include #include #include #include #include #define PORT 7300 #define BUFFER_SIZE 1024 void serve_file(int new_socket, char *filename) { int fd; ssize_t bytes_read; char file_buffer[BUFFER_SIZE]; fd = open(filename, O_RDONLY); if (fd == -1) { perror("Error opening file"); return; } while ((bytes_read = read(fd, file_buffer, BUFFER_SIZE)) > 0) { write(new_socket, file_buffer, bytes_read); } close(fd); } int main(int argc, char *argv[]) { int server_fd, new_socket; struct sockaddr_in address; int opt = 1; int addrlen = sizeof(address); char buffer[BUFFER_SIZE] = {0}; char *hello = "HTTP/1.1 200 OK\nContent-Type: application/pdf\r\n\r\n"; // Creating socket file descriptor if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // Forcefully attaching socket to the port 8080 address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); // Forcefully attaching socket to the port 8080 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) { perror("bind failed"); exit(EXIT_FAILURE); } if (listen(server_fd, 3) < 0) { perror("listen"); exit(EXIT_FAILURE); } while (1) { printf("\n+++++++ Waiting for new connection ++++++++\n\n"); if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) { perror("accept"); exit(EXIT_FAILURE); } read(new_socket, buffer, BUFFER_SIZE); printf("%s\n", buffer); // Here you need to parse the request and extract the filename. // For simplicity, we're always serving the same file. char *filename = argv[1]; write(new_socket, hello, strlen(hello)); serve_file(new_socket, filename); printf("File served successfully\n"); close(new_socket); } return 0; }