Can some help me on finding a way to have the HOME_PAGE read from and HTML file instead of being hardcode? THis is the code:
/* webserver.c */ #include #include #include #include #if defined(LINUX) || defined(SOLARIS) #include #endif #define BUFFSIZE 256 #define SERVER_NAME "CNAI Demo Web Server" #define ERROR_400 "Error 400
Th\ e server couldn't understand your request. " #define ERROR_404 "
Error 404
Do\ cument not found. " #define HOME_PAGE "
Welcome to the CNAI\ Demo Server
Why not visit:
- Netbook Home Page
- Comer Books Home Page
" #define TIME_PAGE "The current date is\ : %s
" int recvln(connection, char *, int); void send_head(connection, int, int); /*----------------------------------------------------------------------* * Program: webserver * Purpose: serve hard-coded webpages to web clients * Usage: webserver * *----------------------------------------------------------------------*/ int main(int argc, char *argv[]) { connection conn; int n; Example Web Server Code 579 char buff[BUFFSIZE], cmd[16], path[64], vers[16]; char *timestr; #if defined(LINUX) || defined(SOLARIS) struct timeval tv; #elif defined(WIN32) time_t tv; #endif if (argc != 2) { (void) fprintf(stderr, "usage: %s ", argv[0]); exit(1); } while(1) { /* wait for contact from a client on specified appnum */ conn = await_contact((appnum) atoi(argv[1])); if (conn < 0) exit(1); /* read and parse the request line */ n = recvln(conn, buff, BUFFSIZE); sscanf(buff, "%s %s %s", cmd, path, vers); /* skip all headers - read until we get alone */ while((n = recvln(conn, buff, BUFFSIZE)) > 0) { if (n == 2 && buff[0] == ' ' && buff[1] == ' ') break; } /* check for unexpected end of file */ if (n < 1) { (void) send_eof(conn); continue; } /* check for a request that we cannot understand */ if (strcmp(cmd, "GET") || (strcmp(vers, "HTTP/1.0") && strcmp(vers, "HTTP/1.1"))) { 580 A Simplified API Appendix 1 send_head(conn, 400, strlen(ERROR_400)); (void) send(conn, ERROR_400, strlen(ERROR_400),0); (void) send_eof(conn); continue; } /* send the requested web page or a "not found" error */ if (strcmp(path, "/") == 0) { send_head(conn, 200, strlen(HOME_PAGE)); (void) send(conn, HOME_PAGE, strlen(HOME_PAGE),0); } else if (strcmp(path, "/time") == 0) { #if defined(LINUX) || defined(SOLARIS) gettimeofday(&tv, NULL); timestr = ctime(&tv.tv_sec); #elif defined(WIN32) time(&tv); timestr = ctime(&tv); #endif (void) sprintf(buff, TIME_PAGE, timestr); send_head(conn, 200, strlen(buff)); (void) send(conn, buff, strlen(buff), 0); } else { /* not found */ send_head(conn, 404, strlen(ERROR_404)); (void) send(conn, ERROR_404, strlen(ERROR_404),0); } (void) send_eof(conn); } } /*----------------------------------------------------------------------* send_head - send an HTTP 1.0 header with given status and content-len *----------------------------------------------------------------------*/ void send_head(connection conn, int stat, int len) { char *statstr, buff[BUFFSIZE]; /* convert the status code to a string */ switch(stat) { case 200: statstr = "OK"; Example Web Server Code 581 break; case 400: statstr = "Bad Request"; break; case 404: statstr = "Not Found"; break; default: statstr = "Unknown"; break; } /* * send an HTTP/1.0 response with Server, Content-Length, * and Content-Type headers. */ (void) sprintf(buff, "HTTP/1.0 %d %s ", stat, statstr); (void) send(conn, buff, strlen(buff), 0); (void) sprintf(buff, "Server: %s ", SERVER_NAME); (void) send(conn, buff, strlen(buff), 0); (void) sprintf(buff, "Content-Length: %d ", len); (void) send(conn, buff, strlen(buff), 0); (void) sprintf(buff, "Content-Type: text/html "); (void) send(conn, buff, strlen(buff), 0); (void) sprintf(buff, " "); (void) send(conn, buff, strlen(buff), 0); }