#include #include #include #include #include #include #include #include #include #include #include #define PORT 8080 #define BUFFER_SIZE 1024 int main(void) { // http server char buffer[BUFFER_SIZE]; char resp[] = "HTTP/1.0 200 OK\r\n" "Server: webserver-c\r\n" "Content-type: text/html\r\n\r\n" "hello, world\r\n"; // create socket int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1){ perror("webserver (socket)"); return 1; } printf("socket created succesfully\n"); // bind to port and address struct sockaddr_in host_addr; socklen_t host_addr_len = sizeof(host_addr); host_addr.sin_family = AF_INET; host_addr.sin_port = htons(PORT); host_addr.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(sockfd, (struct sockaddr*)&host_addr, host_addr_len) != 0){ perror("webserver (bind)"); return 1; } printf("socket succesfully bound to address\n"); // create client address struct sockaddr_in client_addr; int client_addr_len = sizeof(host_addr); // accept connections while (1) { int newsockfd = accept(sockfd, (struct sockaddr*) &host_addr, (socklen_t *) &host_addr_len); if (newsockfd < 0){ perror("webserver (accept)"); return 1; } printf("connection accepted\n"); // get client addr int sockn = getsockname(newsockfd, (struct sockaddr*) &client_addr, (socklen_t *) &client_addr_len); if (sockn < 0){ perror("webserver (getsockname)"); return 1; } // read from socket ssize_t valread = read(newsockfd, buffer, BUFFER_SIZE); if (valread < 0){ perror("webserver (read)"); } // read the request char method[BUFFER_SIZE], uri[BUFFER_SIZE], version[BUFFER_SIZE]; sscanf(buffer, "%s %s %s", method, uri, version); printf("[%s:%u] %s %s %s\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), method, version, uri); // write to the socket ssize_t valwrite = write(newsockfd, resp, strlen(resp)); if (valwrite < 0){ perror("webserver (write)"); } close(newsockfd); } return 0; }