• 大小: 10KB
    文件类型: .7z
    金币: 1
    下载: 0 次
    发布日期: 2021-05-29
  • 语言: 其他
  • 标签: ICS  lab10  WebProxy  

资源简介

ICS lab10 WebProxy 包含 proxy.c

资源截图

代码片段和文件信息

/*
 * proxy.c - CS:APP Web proxy
 *
 * TEAM MEMBERS:
 *     Andrew Carnegie ac00@cs.cmu.edu 
 *     Harry Q. Bovik bovik@cs.cmu.edu
 * 
 * A simple web proxy implement.
 * No cache. No thread pool. No post method.
 * 
 */ 

#include “csapp.h“
#include 

#define _DEBUG

#define DEFPORT 8888

typedef struct client_info
{
  int connfd;
  struct sockaddr_in sockaddr;
} client_info_t;

/*
 * Gloval vars
 */
sem_t sem_log;
sem_t sem_dns;
FILE *log_file;

/*
 * Function prototypes
 */
int parse_uri(char *uri char *target_addr char *path int *port);
void format_log_entry(char *logstring struct sockaddr_in *sockaddr char *uri int size);
void *work_init(void *arg);
void do_work(int connfd struct sockaddr_in *sockaddr);
void my_clienterror(int fd int errnum char *errmsg char *longmsg);
int open_clientfd_ts(char *hostname int port);
int Open_clientfd_ts(char *hostname int port) ;
void dbg_printf(char *format ...);



/*
 * dbg_printf - only print msg in debug mode
 */
void dbg_printf(char *format ...)
{
#ifdef _DEBUG
    va_list va;
    va_start(va format);
    vprintf(format va);
    va_end(va);
#endif
}

/*
 * wrapper of three rio functions
 */
ssize_t Rio_readnb_w(rio_t *rp void *usrbuf size_t n) 
{
    ssize_t rc;

    if ((rc = rio_readnb(rp usrbuf n)) < 0)
    {
      fprintf(stderr “Rio_readnb error: %s\n“ strerror(errno));
      return 0;
    }
    return rc;
}

ssize_t Rio_readlineb_w(rio_t *rp void *usrbuf size_t maxlen) 
{
    ssize_t rc;

    if ((rc = rio_readlineb(rp usrbuf maxlen)) < 0)
    {
      fprintf(stderr “Rio_readlineb error: %s\n“ strerror(errno));
      return 0;
    }
    return rc;


void Rio_writen_w(int fd void *usrbuf size_t n) 
{
    if (rio_writen(fd usrbuf n) != n)
      fprintf(stderr “Rio_writen error: %s\n“ strerror(errno));
}

/*
 * Open_clientfd_ts - wrapper of open_clientfd_s
 */
int Open_clientfd_ts(char *hostname int port) 
{
    int rc = open_clientfd_ts(hostname port);
    if (rc == -1)
      unix_error(“Open_clientfd_s Unix error“);
    else if(rc == -2)        
    dns_error(“Open_clientfd_s DNS error“);
    return rc;
}

/*
 * open_clientfd_s - thread-safe version for open_clientfd
 */
int open_clientfd_ts(char *hostname int port) 
{
    int clientfd;
    struct hostent *hp;
    struct sockaddr_in serveraddr;

    if ((clientfd = socket(AF_INET SOCK_STREAM 0)) < 0)
      return -1; /* check errno for cause of error */

    /* Fill in the server‘s IP address and port */
    P(&sem_dns);
    if ((hp = gethostbyname(hostname)) == NULL)
    {
      V(&sem_dns);
      return -2; /* check h_errno for cause of error */
    } 
    bzero((char *) &serveraddr sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    bcopy((char *)hp->h_addr_list[0] 
  (char *)&serveraddr.sin_addr.s_addr hp->h_length);
    V(&sem_dns);
    serveraddr.sin_port = htons(port);

    /* Establish a connection with the server */
    if (connect(clientfd (SA *) &serveraddr sizeof(ser

评论

共有 条评论