EBK COMPUTER SYSTEMS
EBK COMPUTER SYSTEMS
3rd Edition
ISBN: 8220101459107
Author: O'HALLARON
Publisher: YUZU
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
A3Q3.c - You are to write a C program that implements the following disk scheduling algorithms: a. FCFS [10 marks] b. SCAN [10 marks] c. C-SCAN [10 marks] d. SSTF [10 marks] e. LOOK [10 marks] f. C-LOOK [10 marks] • Your program will service a disk with 300 cylinders numbered 0 to 299. • • • • The program will service the requests (a list of 20 cylinder numbers) given in the file request.bin. This file contains (4 byte) integer values representing requests ranging from 0-299. Your program will take the initial position of the disk head as the first command line argument and the direction of the head as the second command line argument. It will then output the requests in the order in which they are serviced, and the total amount of head movements required by each algorithm. In particular, your program needs to do the following: Your program should take two command line arguments a) First command line argument - initial position of the disk head (an integer value) b) Second command line…
2. The memory management has contiguous memory allocation, dynamic partitions, and paging. Compare the internal fragmentation and external fragmentation for these three approaches. [2 marks] 3. Suppose we have Logical address space = 24 = 16 (m = 4), Page size=2² =4 (n = 2), Physical address space = 26 = 64 (r = 6). Answer the following questions: [4 marks] 1) Total # of pages ? 2) Total # of frames ? 3) Number of bits to represent logical address? 4) Number of bits to represent offset ? 5) Number of bits to represent physical address? 6) Number of bits to represent a page number? 7) Number of bits to represent a frame number / 4. What is translation look-aside buffers (TLBS)? Why we need them to implement the page table? [2 marks] 5. Why we need shared pages for multiple processes? Give one example to show the benefits. [2 marks] 6. How to implement the virtual memory by using page out and page in? Explain with an example. [2 marks] 7. We have a reference string of referenced page…
8. List three HDD scheduling algorithms. [2 marks] 9. True or False? The NVM has the same scheduling algorithms with HDD. Explain why? [2 marks] 10. Why the modern mouses use polling to detect movements instead of interrupts? [2 marks] 11. What is thrashing? How does it happen? [2 marks] 12. Given a reference string of page numbers 7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1 and 4 frames show how the page replacement algorithms work, and how many page faults? [6 marks], 1) FIFO algorithm? [2 marks] 2) Optimal algorithm? [2 marks] 3) LRU algorithm? [2 marks] 13. List at least three file systems that you know. [2 marks] 14. In C programming, how the seek to a specific position in the file by offset? [2 marks]
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
EBK JAVA PROGRAMMING
Computer Science
ISBN:9781337671385
Author:FARRELL
Publisher:CENGAGE LEARNING - CONSIGNMENT
Text book image
CMPTR
Computer Science
ISBN:9781337681872
Author:PINARD
Publisher:Cengage
Text book image
Systems Architecture
Computer Science
ISBN:9781305080195
Author:Stephen D. Burd
Publisher:Cengage Learning
Text book image
EBK JAVA PROGRAMMING
Computer Science
ISBN:9781305480537
Author:FARRELL
Publisher:CENGAGE LEARNING - CONSIGNMENT
Text book image
C++ Programming: From Problem Analysis to Program...
Computer Science
ISBN:9781337102087
Author:D. S. Malik
Publisher:Cengage Learning