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
Expert Solution & Answer
Book Icon
Chapter 12, Problem 12.39HW

A.

Explanation of Solution

C code:

//Include Header file

#include <stdio.h>

#include "csapp.h"

//Define the maximum entry for blocked list

#define MAXIMUMSIZE 100

//Function declaration

int divideURI(char *URIName, char *hostName, char *portNumber, char *pName);

void parseBlockList(char *fName, char list[MAXIMUMSIZE][MAXLINE], int limit);

int blockedURIList(char *URIName, char list[MAXIMUMSIZE][MAXLINE]);

//Main function

int main(int argc, char **argv)

{

  //Declare required variable

  int i, listenfd, connfd;

  int clientfd;

  //Create socket

  socklen_t clientlen;

  //Create structure for client address

  struct sockaddr_storage clientaddr;

  //Create rio function

  rio_t cRio, sRio;

  char cbuffer[MAXLINE], sbuffer[MAXLINE];

  ssize_t ssn, ccn;

char methodName[MAXLINE], URIName[MAXLINE], versionNo[MAXLINE];

char hostName[MAXLINE], portNumber[MAXLINE], pName[MAXLINE];

  char block_list[MAXIMUMSIZE][MAXLINE];

  int logFileDes;

  char logFileBuffer[MAXLINE];

  //Check command line arguments

  if (argc != 2)

  {

    //Display message

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

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

    listenfd = Open_listenfd("5000");

  }

  else

  {

    listenfd = Open_listenfd(argv[1]);

  }

  //Open log files

logFileDes = Open("log.list", O_WRONLY | O_APPEND, 0);

  //Set memory for block list

  memset(block_list, '\0', MAXLINE * MAXIMUMSIZE);

  //Call function for parse file

parseBlockList("block.list", block_list, MAXIMUMSIZE);

  //Check condition

  while (1)

  {

    /* wait for connection as a server */

    clientlen = sizeof(struct sockaddr_storage);

    //Call accept method

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

    Rio_readinitb(&sRio, connfd);

    /* Check URI Name full path */

    if (!Rio_readlineb(&sRio, sbuffer, MAXLINE))

    {

      Close(connfd);

      continue;

    }

    //Display the uri path

sscanf(sbuffer, "%s %s %s", methodName, URIName, versionNo);

    /* Check blocked uri */

    if (blockedURIList(URIName, block_list))

    {

      printf("%s is blocked\n", URIName);

      Close(connfd);

      continue;

    }

    //Display the visit uri

sprintf(logFileBuffer, "visit url: %s\n", URIName);

Write(logFileDes, logFileBuffer, strlen(logFileBuffer));

    memset(hostName, '\0', MAXLINE);

    memset(portNumber, '\0', MAXLINE);

    memset(pName, '\0', MAXLINE);

    //Declare variable

    int res;

    /* Check if the given uri is separate */

if ((res = divideURI(URIName, hostName, portNumber, pName)) == -1)

    {

fprintf(stderr, "is not http protocol\n");

      Close(connfd);

      continue;

    }

    else if (res == 0)

    {

fprintf(stderr, "is not a abslute request path\n");

      Close(connfd);

      continue;

    }

    //Connect server as a client

    clientfd = Open_clientfd(hostName, portNumber);

    Rio_readinitb(&cRio, clientfd);

    //Send the first request

sprintf(sbuffer, "%s %s %s\n", methodName, pName, versionNo);

    Rio_writen(clientfd, sbuffer, strlen(sbuffer));

    printf("%s", sbuffer);

    do

    {

      /* Call next http requests */

ssn = Rio_readlineb(&sRio, sbuffer, MAXLINE);

      printf("%s", sbuffer);

      Rio_writen(clientfd, sbuffer, ssn);

    }

    while(strcmp(sbuffer, "\r\n"));

    //For server send reply back

while ((ccn = Rio_readlineb(&cRio, cbuffer, MAXLINE)) != 0)

      Rio_writen(connfd, cbu...

B.

Explanation of Solution

C code:

#include <stdio.h>

#include "csapp.h"

//Define the maximum entry for blocked list

#define MAXIMUMSIZE 100

//Function declaration

int divideURI(char *URIName, char *hostName, char *portName, char *pathName);

void parseBlockList(char *fName, char list[MAXIMUMSIZE][MAXLINE], int limit);

int blockedURIList(char *URIName, char list[MAXIMUMSIZE][MAXLINE]);

void *proxyThreadFunction(void *vargp);

//Declare variable for blocked url list

static char bList[MAXIMUMSIZE][MAXLINE];

//Declare variable for log file fd

static int logFileDesc;

//Main function

int main(int argc, char **argv)

{

  //Declare required variable

  int listenfd;

  //Create socket

  socklen_t clientlen;

  //Create structure for client address

  struct sockaddr_storage clientaddr;

  int *connfdp;

  pthread_t tid;

  //Check command line arguments

  if (argc != 2)

  {

    //Display message

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

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

    listenfd = Open_listenfd("5000");

  }

  else

  {

    listenfd = Open_listenfd(argv[1]);

  }

  //Open log files

logFileDesc = Open("log.list", O_WRONLY | O_APPEND, 0);

  //Set memory for block list 

  memset(bList, '\0', MAXLINE * MAXIMUMSIZE);

  //Call function for parse file

  parseBlockList("block.list", bList, MAXIMUMSIZE);

  //Check condition

  while (1)

  {

    /* wait for connection as a server */

    clientlen = sizeof(struct sockaddr_storage);

    connfdp = Malloc(sizeof(int));

    //Call accept method

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

    //Generate new thread

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

  }

  //Close log file descriptor

  Close(logFileDesc);

}

//Function definition for proxy thread

void *proxyThreadFunction(void *vargp)

{

  //Create thread id

  pthread_t tid = Pthread_self();

  Pthread_detach(tid);

  int connfd = *(int*)vargp;

  Free(vargp);

  //Create rio function

  rio_t cRio, sRio;

/* Declare required variable for client and server buffer */

  char cBuffer[MAXLINE], sBuffer[MAXLINE];

ssize_t ssn, ccn;

/* Declare variable for method name, uri, version number, host name, port number and path name*/

char methodName[MAXLINE], URIName[MAXLINE], versionNumber[MAXLINE];

char hostName[MAXLINE], portName[MAXLINE], pathName[MAXLINE];

  char logFileBuffer[MAXLINE];

  int clientfd;

  Rio_readinitb(&sRio, connfd);

  /* Check URI Name full path */

  if (!Rio_readlineb(&sRio, sBuffer, MAXLINE))

  {

    Close(connfd);

    return NULL;

  }

  //Display the uri path

sscanf(sBuffer, "%s %s %s", methodName, URIName, versionNumber);

  /* Check blocked uri */

  if (blockedURIList(URIName, bList))

  {

printf("Thread %ld: %s is blocked\n", tid, URIName);

    Close(connfd);

    return NULL;

  }

  //Print the log visit

sprintf(logFileBuffer, "Thread %ld: visit url: %s\n", tid, URIName);

Write(logFileDesc, logFileBuffer, strlen(logFileBuffer));

  memset(hostName, '\0', MAXLINE);

  memset(portName, '\0', MAXLINE);

  memset(pathName, '\0', MAXLINE);

  int res;

  /* Check if the given uri is separate */

if ((res = divideURI(URIName, hostName, portName, pathName)) == -1)

  {

fprintf(stderr, "tid %ld: not http protocol\n", tid);

    Close(connfd);

    return NULL;

  }

  else if (res == 0)

  {

fprintf(stderr, "tid %ld: not a abslute request path\n", tid);

    Close(connfd);

    return NULL;

  }

  //Connect server as a client

  clientfd = Open_clientfd(hostName, portName);

  Rio_readinitb(&cRio, clientfd);

  //Send the first request

sprintf(sBuffer, "%s %s %s\n", methodName, pathName, versionNumber);

  Rio_writen(clientfd, sBuffer, strlen(sBuffer));

  printf("tid %ld: %s", tid, sBuffer);

  do

  {

    /* Call next http requests */

    ssn = Rio_readlineb(&sRio, sBuffer, MAXLINE);

    printf("Tid %ld: %s", tid, sBuffer);

    Rio_writen(clientfd, sBuffer, ssn);

  } while(strcmp(sBuffer, "\r\n"));

  //For server send reply back

while ((ccn = Rio_readlineb(&cRio, cBuffer, MAXLINE)) != 0)

    Rio_writen(connfd, cBuffer, ccn);

�...

Blurred answer
Students have asked these similar questions
Design a web page to enter the data like Person Name, Age, and Sex. Write a server program to find the eligibility for voting by satisfying the following criteria. Age Eligibility >=18 years Yes <18 years No Give the notification about eligibility status. Write the necessary routes to implement the above scenario using ExpressJS.
Write a client-server java application in which two clients can send a Morse-code message to each other through a multithreaded server application. The client application should allow the user to type English-language when the user sends the message, the client application encoded the text into Morse-code and sends the coded message through the server to the client. use one blank between each Morse-code letter and three blanks between each Morse-coded word. Note: At the server side, use Map<String, Character> for the mapping between the Morse code and its corresponding normal character in java
I need a help with my python activity. This requires 2 clients and 1 server. This is a system to support an online math contest.   Rule: There are two participants answering at the same time.   The host is responsible in starting up the server, after that they wait for the clients. When the two clients are connected, they must send the message: READY to the server. When the server receives the two READY from the clients, the contest starts.   The server will display 3 questions one after another which can be answered in 30 secs each. 11+10 = 21 10+22 = 32 10+10 = 20   The participant with most correct answers wins.   At the end of the program, the server must show the results. ex: Client1 WINS! 2/3 Client2: 1/3
Knowledge Booster
Background pattern image
Similar questions
SEE MORE QUESTIONS
Recommended textbooks for you
  • Text book image
    Microsoft Visual C#
    Computer Science
    ISBN:9781337102100
    Author:Joyce, Farrell.
    Publisher:Cengage Learning,
Text book image
Microsoft Visual C#
Computer Science
ISBN:9781337102100
Author:Joyce, Farrell.
Publisher:Cengage Learning,