Computer Systems: A Programmer's Perspective (3rd Edition)
Computer Systems: A Programmer's Perspective (3rd Edition)
3rd Edition
ISBN: 9780134092669
Author: Bryant, Randal E. Bryant, David R. O'Hallaron, David R., Randal E.; O'Hallaron, Bryant/O'hallaron
Publisher: PEARSON
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
Students have asked these similar questions
Hello, the code task below has to be written in python 3 and the HTTP must show the html file from the command line. Please help. Currently, the web server handles only one HTTP request at a time. Implement a multithreaded server that is capable of serving multiple requests simultaneously. Using threading, first create a main thread in which your modified server listens for clients at a fixed port. When it receives a TCP connection request from a client, it will set up the TCP connection through another port and services the client request in a separate thread. There will be a separate TCP connection in a separate thread for each request/response pair.
Write a Java program using Thread with single Server and Multiple Clients. NOTE: Client must be running until Bye message is sent. Server should never stop. I need answer question pls
Implement a solution to the critical section problem with threads using semaphores. you must add a third counting thread which counts by 1 each time it enters its critical section to 3,000,000. Each counts to 3,000,000 for a total of 9,000,000.
Knowledge Booster
Background pattern image
Computer Science
Learn more about
Need a deep-dive on the concept behind this application? Look no further. Learn more about this topic, computer-science and related others by exploring similar questions and additional content below.
Similar questions
SEE MORE QUESTIONS
Recommended textbooks for you
Text book image
Database System Concepts
Computer Science
ISBN:9780078022159
Author:Abraham Silberschatz Professor, Henry F. Korth, S. Sudarshan
Publisher:McGraw-Hill Education
Text book image
Starting Out with Python (4th Edition)
Computer Science
ISBN:9780134444321
Author:Tony Gaddis
Publisher:PEARSON
Text book image
Digital Fundamentals (11th Edition)
Computer Science
ISBN:9780132737968
Author:Thomas L. Floyd
Publisher:PEARSON
Text book image
C How to Program (8th Edition)
Computer Science
ISBN:9780133976892
Author:Paul J. Deitel, Harvey Deitel
Publisher:PEARSON
Text book image
Database Systems: Design, Implementation, & Manag...
Computer Science
ISBN:9781337627900
Author:Carlos Coronel, Steven Morris
Publisher:Cengage Learning
Text book image
Programmable Logic Controllers
Computer Science
ISBN:9780073373843
Author:Frank D. Petruzella
Publisher:McGraw-Hill Education