EBK COMPUTER SYSTEMS
EBK COMPUTER SYSTEMS
3rd Edition
ISBN: 8220101459107
Author: O'HALLARON
Publisher: YUZU
bartleby

Concept explainers

Expert Solution & Answer
Book Icon
Chapter 12, Problem 12.37HW

Explanation of Solution

Implementation of a concurrent version of the TINY web server on I/O threads:

Modified “main.c” code:

#include "csapp.h"

//Function declaration

void doit(int fd);

void read_requesthdrs(rio_t *rp);

int parse_uri(char *uri, char *filename, char *cgiargs);

void serve_static(int fd, char *filename, int filesize);

void get_filetype(char *filename, char *filetype);

void serve_dynamic(int fd, char *filename, char *cgiargs);

void clienterror(int fd, char *cause, char *errnum,char *shortmsg, char *longmsg);

void *thread(void *vargp);

//Main function

int main(int argc, char **argv)

{

  //Declare variable

  int listenfd, connfd;

  int *connfdp;

  pthread_t tid;

  char hostname[MAXLINE], port[MAXLINE];

  socklen_t clientlen;

  struct sockaddr_storage clientaddr;

/* Check the command line argument. if the argument does not satify, then  */

  if (argc != 2)

  {

    //Display the below error message

    fprintf(stderr, "usage: %s <port>\n", argv[0]);

    fprintf(stderr, "use default port 5000\n");

    listenfd = Open_listenfd("5000");

  }

  //Otherwise,

  else

  {

    //Call the Open_listenfd method

    listenfd = Open_listenfd(argv[1]);

  }

  //Check condition

  while (1)

  {

    //Get the length the client address

    clientlen = sizeof(clientaddr);

    //For connection accept

    connfd = Accept(listenfd, (SA *)&clientaddr, &clientlen);

    //Call the method

Getnameinfo((SA *) &clientaddr, clientlen, hostname, MAXLINE,

        port, MAXLINE, 0);

    //Display the accepted connection

printf("Accepted connection from (%s, %s)\n", hostname, port);

    connfdp = (int*)Malloc(sizeof(int));

    *connfdp = connfd;

    //Call Pthread_create method

    Pthread_create(&tid, NULL, thread, connfdp);

  }

}

//Function definition for thread method

void *thread(void *vargp)

{

  //Compute the connection file descriptor number

  int connfd = *(int*)vargp;

  //Call pthread detach method

  Pthread_detach(Pthread_self());

  //Free the given file

  Free(vargp);

  //Call doit method

  doit(connfd);

  //Close the connection

  Close(connfd);

  return NULL;

}

/* Function definition for doit method that is for handle HTTP request or response transfer */

void doit(int fd)

{

  //Declare variable

  int is_static;

  struct stat sbuf;

char buf[MAXLINE], method[MAXLINE], uri[MAXLINE], version[MAXLINE];

  char filename[MAXLINE], cgiargs[MAXLINE];

  //Create object for rio function

  rio_t rio;

  /* Read request line and headers */

  Rio_readinitb(&rio, fd);

  //Check read request

  if (!Rio_readlineb(&rio, buf, MAXLINE)) 

    return;

  //Display the buffer

  printf("%s", buf);

  //Display the parse request

  sscanf(buf, "%s %s %s", method, uri, version); 

  //Check condition  

  if (strcasecmp(method, "GET"))

  {              

    //Call client error method

clienterror(fd, method, "501", "Not Implemented","Tiny does not implement this method");

    return;

  }        

  //Call read_requestdrs method

  read_requesthdrs(&rio);

  /* Parse URI from GET request */

  is_static = parse_uri(uri, filename, cgiargs);     

  //Check the static connection

  if (stat(filename, &sbuf) < 0)

  {            

    //Call client error method     

    clienterror(fd, filename, "404", "Not found",

        "Tiny couldn't find this file");

    return;

  }

  /* Check serve static content */

  if (is_static)

  {

if (!(S_ISREG(sbuf.st_mode)) || !(S_IRUSR & sbuf.st_mode))

    {     

      //Call client error method

clienterror(fd, filename, "403", "Forbidden","Tiny couldn't read the file");

      return;

    }

    //Call serve_static method

    serve_static(fd, filename, sbuf.st_size);

  }

  //Otherwise check the serve dynamic content

  else

  {

if (!(S_ISREG(sbuf.st_mode)) || !(S_IXUSR & sbuf.st_mode))

    {

      //Call client error method

clienterror(fd, filename, "403", "Forbidden","Tiny couldn't run the CGI program");

      return;

    }

    //Call serve dynamic method

    serve_dynamic(fd, filename, cgiargs);

  }

}

/* Function definition for read_requestdrs that is for read HTTP request headers */

void read_requesthdrs(rio_t *rp)

{

  //Declare variable

  char buf[MAXLINE];

  Rio_readlineb(rp, buf, MAXLINE);

  printf("%s", buf);

  //Check condition

  while(strcmp(buf, "\r\n"))

  {       

    //Call rio readlineb function

    Rio_readlineb(rp, buf, MAXLINE);

    printf("%s", buf);

  }

  return;

}

/* Function definition for parse uri into file nane and cgi argument */

int parse_uri(char *uri, char *filename, char *cgiargs)

{

  //Declare char variable

  char *ptr;

  //Check content type...

Blurred answer
Knowledge Booster
Background pattern image
Computer Engineering
Learn more about
Need a deep-dive on the concept behind this application? Look no further. Learn more about this topic, computer-engineering and related others by exploring similar questions and additional content below.
Recommended textbooks for you
Text book image
Computer Networking: A Top-Down Approach (7th Edi...
Computer Engineering
ISBN:9780133594140
Author:James Kurose, Keith Ross
Publisher:PEARSON
Text book image
Computer Organization and Design MIPS Edition, Fi...
Computer Engineering
ISBN:9780124077263
Author:David A. Patterson, John L. Hennessy
Publisher:Elsevier Science
Text book image
Network+ Guide to Networks (MindTap Course List)
Computer Engineering
ISBN:9781337569330
Author:Jill West, Tamara Dean, Jean Andrews
Publisher:Cengage Learning
Text book image
Concepts of Database Management
Computer Engineering
ISBN:9781337093422
Author:Joy L. Starks, Philip J. Pratt, Mary Z. Last
Publisher:Cengage Learning
Text book image
Prelude to Programming
Computer Engineering
ISBN:9780133750423
Author:VENIT, Stewart
Publisher:Pearson Education
Text book image
Sc Business Data Communications and Networking, T...
Computer Engineering
ISBN:9781119368830
Author:FITZGERALD
Publisher:WILEY