From 25f7ef1967e73a64666f80911c22e8ce41f18e3e Mon Sep 17 00:00:00 2001 From: ChoChoX Date: Thu, 18 Jun 2026 18:13:12 +0800 Subject: [PATCH] 4 --- server-exp2/weblet | Bin 38848 -> 38904 bytes server-exp2/webletsp | Bin 40928 -> 41000 bytes server-exp2/webletsp.c | 7 +- server-exp2/webletst | Bin 39936 -> 39992 bytes ...验2任务报告(多进程和多线程模型)(1).docx | Bin 100232 -> 99948 bytes server-exp3/cgi-bin/add | Bin 0 -> 19544 bytes server-exp3/cgi-bin/add.c | 27 + server-exp3/common.c | 243 +++++++++ server-exp3/common.h | 78 +++ server-exp3/example.jpg | Bin 0 -> 193852 bytes server-exp3/favicon.ico | Bin 0 -> 16166 bytes server-exp3/index.html | 13 + server-exp3/run.log | 7 + server-exp3/server_pool.log | 0 server-exp3/t1.txt | 6 + server-exp3/t2.txt | 6 + server-exp3/test.html | 8 + server-exp3/thpool.c | 474 ++++++++++++++++++ server-exp3/thpool.h | 222 ++++++++ server-exp3/togglec | Bin 0 -> 25360 bytes server-exp3/togglec.c | 30 ++ server-exp3/togglecm | 6 + server-exp3/togglest_pool | Bin 0 -> 47424 bytes server-exp3/togglest_pool.c | 113 +++++ server-exp3/urls | 2 + server-exp3/webclient | Bin 0 -> 20336 bytes server-exp3/webclient.c | 55 ++ server-exp3/webserver | Bin 0 -> 38384 bytes server-exp3/webserver.c | 343 +++++++++++++ server-exp3/webserver.log | 92 ++++ server-exp3/webserver_pool | Bin 0 -> 58760 bytes server-exp3/webserver_pool.c | 374 ++++++++++++++ server-exp3/实验3任务报告.docx | Bin 0 -> 21672 bytes server-exp3/实验3文件清单.txt | 3 + 34 files changed, 2107 insertions(+), 2 deletions(-) create mode 100644 server-exp3/cgi-bin/add create mode 100644 server-exp3/cgi-bin/add.c create mode 100644 server-exp3/common.c create mode 100644 server-exp3/common.h create mode 100644 server-exp3/example.jpg create mode 100644 server-exp3/favicon.ico create mode 100644 server-exp3/index.html create mode 100644 server-exp3/run.log create mode 100644 server-exp3/server_pool.log create mode 100644 server-exp3/t1.txt create mode 100644 server-exp3/t2.txt create mode 100644 server-exp3/test.html create mode 100644 server-exp3/thpool.c create mode 100644 server-exp3/thpool.h create mode 100755 server-exp3/togglec create mode 100644 server-exp3/togglec.c create mode 100644 server-exp3/togglecm create mode 100755 server-exp3/togglest_pool create mode 100644 server-exp3/togglest_pool.c create mode 100644 server-exp3/urls create mode 100755 server-exp3/webclient create mode 100644 server-exp3/webclient.c create mode 100755 server-exp3/webserver create mode 100644 server-exp3/webserver.c create mode 100644 server-exp3/webserver.log create mode 100755 server-exp3/webserver_pool create mode 100644 server-exp3/webserver_pool.c create mode 100644 server-exp3/实验3任务报告.docx create mode 100644 server-exp3/实验3文件清单.txt diff --git a/server-exp2/weblet b/server-exp2/weblet index 269d4c9e116139880d7162d26eb8353c95c23492..50a75f7a54ea57ad481b845412df4073f2d9b1ee 100755 GIT binary patch delta 7072 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 y=f*;OUsrD|F~ly@Lw_GOx diff --git a/server-exp2/webletsp b/server-exp2/webletsp index 2816b0b391ed58d82f3134515c79e26914e2bb88..41afc8f5ff689290ac54e034c2ce241c9e82c4c2 100755 GIT binary patch delta 7761 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 delta 5612 zcmZ`-4O~-KmVfV&06_u?2q7pWD4+5Xz9XOll|ZymVOpnXRj_r@c5T&)+p#|t5V53b zTIi`t6?C!eK)k>}14HYdG+d7ucoBw_9B?g^+zvP{F z|L1?sz31F>@B8TM6I%O(t{A;JnUjt(S#bT`X}{IfN6M}G?m0yRTdQP_Pm)nc(H~Y&pQJjV zK91Lh96%H2${u`@jtLD3|KFJU0%Ud{l?Rw68&_wRTx|Vf^?e{~&sRn2@ z&;dVGPn&^m0y^Y}M$#dj!5HNi&8VL?nl8fT0&F-XGc3j!(&`Nqst?ub{LomM4RjVz zvmZK@o&>rYXtp03PkVv(0xk1H&2$FnX`r=!=rsBX=s3_uKQxgtBar6^#vUl`13*vyi{lnlBk}I)b#vG0llQP_C<{yQ8G3k?89M=?X zs^GY>@c7$eQgX?}cKluK=o0tL>8Ay%NRDfvB96P+lof8;Ci!L#oa)~da~$jSMAt&Q zs~~AI2H~3BJt&GN)h|KCmX_V|l}G$Z6z$I0jc~Da_&BzprY>fG;*Ps6*rmb3?ov-< zqUct0l-;RLh6M{tBTg9#H?^{!Pbd-we`Z=&!MF5d@>Kpiib;u2y8(#XkiO8~KKs*| zxJ2*Gq3HS?8lK@FMbWcD6vaQNKce8RNRVH`)Fr^U?w zd*;Q}!D#awx1j3706EV`e`aP;KUcI3XvuCjL4nwF5NWxj)HX;W>QO42u|{}LMQ_e9 z=NYkG*j+nnF&gIlsLwnVgYD?w$jpBq%{baKl873hhV*EPO)m_8UdDeZ<8J^j5&op2 z-t^>fyR6EVRfUqt|D~Jf=3#}}owi#m?CGkcRE)n_?FqUiiXWd~GrAD@wzrSyJQXY` z$L3oIYz(WPStwD(-lq8(d6=#(8CIbqiiYx{?yHniuw(QRi$S}U86Xtal2Rz=DS?rk zM+R7gPS<%RT#8A-YAVl+j=PR=fH5R9PEBA`Ge*OEjN!G?&i>mS?UdZO2*%8aqR!!qQG3h*~zWgSFPOU z2g2XxW?44OfOeE==iMZIcDCsmbb<2l*c}^&?2d)!q4s=GifUq<#W$%j+bndB(bjA> z?nBub{3ZGc62mEJfm* zlz*hY9IIfwNjGwGqZWS40_gCd9Go3jaK^a1X=ZM5df}KT-jlg6Zun>JK`fC}Puv*o z&7GD1O(ur#R0%Bd^`JRyBS?n5$9`-`Wp|(m)Mq5dQ~^mk&sa4#NSimsHUu)JDfKRP zx5S>z*aOOvdwWzAuO_wIJp5hUrJ3|(-Yg;fTl(j`JieJOl^Q zK|Dz<&|D7Vq%dHOna7CgjXpo;}L`r_+; z$`+I7Gcpxc2|xRWRu!gAc^FE^apd0Ps8uoHEK^|lKH%^ofc{R?nc{@_XJPp< zZq|1m7ck3*k~l8s`{DSjq$@EBbBEpOCI6+uGtA+a%f!&6^=9eERoNbL=as+C)9`)I zw(wH|N<4^VD*odaM6numGmiOhh727N#TQunvM8z`GrknX7|7L-cxdMeu887($VVaj zA@Bc66fZ#Tha898_6K#&k5V+M;j8LnJ%!fF~Vxa#Wl6S~^f|;e%LASj+ zF5@MXg~2UowIN{EK*wp~Fy0ug%uFQ5Bhy-b&XkX^)8Dbv6YR8raaCWV{=%4ARft}~ z8rjtvoHCiKEsQ7ow4!Oum3_X>U}z=4?LgCnjGgwWwL|seH|n^uw-5ZyHIrx9BqkM+q8lU=QUyAsJhP|ZQ()}v$TbSS$mim5dabb{a=TKx!#;cpeb=~! zpF+*cr}2wu*YYy`o%)qY+uWYz#VX!T)0-9x^)soZX{GR@l{`&bg|R|fy>gB4Rv}$n zSt1-Npx9Llv8vauY8IUN?*Co&wi;X3-lzTu&#Tt7tA~SE2LC&Kx8|lUTRkcG51gRl z1B17!`M?GLy6zayOinxvfO*jmK~H?1v;-$Zq7mYiB;pTOgvbX>-n=M0?p>y-j?SEUO*mq>56 z8DhPAhgUlpQxSoobXw?gTP6BQ+gfEDQ)X?C!eTcfMp{FTtp>WzOB@>qbqp z9=nvxd2c7rVd*g3ObO3b8NIXIqm1*WVzr&xo_j`kFP&~bR~hS4^5l)U1HK}JFm7!z zE$;jWHt(Nyz9`&Cr$-%GA$Mw#b~|3fCSCOWB@JIj##bzwVC-Y;2&TGMtok`vf$Z?g zwe%`DhZXcNoqffsF^9?=GwF9&eH*lQqh3XecC_GbFu22_F;Dj~cUmcUr%o6ZXz|W0 z-=|RTC()(!>P}0D_a1@#e!8=gPbA|mi{{Sf#kyTqjjlrWsH1MQd>McLUfp9w9?$M6<$p%{-ju%rx$y2g diff --git a/server-exp2/实验2任务报告(多进程和多线程模型)(1).docx b/server-exp2/实验2任务报告(多进程和多线程模型)(1).docx index 21b6958ead51fd8f157f7618b8e12855e7977757..b9a1cf45fc2580cc334188960a3e2057e7d64bda 100644 GIT binary patch delta 11832 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 diff --git a/server-exp3/cgi-bin/add b/server-exp3/cgi-bin/add new file mode 100644 index 0000000000000000000000000000000000000000..6c586711d3e9841adc08a212330df3272aa52fc1 GIT binary patch literal 19544 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 F@qhSnMs5HA literal 0 HcmV?d00001 diff --git a/server-exp3/cgi-bin/add.c b/server-exp3/cgi-bin/add.c new file mode 100644 index 0000000..2d32e7a --- /dev/null +++ b/server-exp3/cgi-bin/add.c @@ -0,0 +1,27 @@ +#include +#include +#include +#define MAXLINE 8192 + +int main(void) { + char *buf, *p; + char content[MAXLINE]; + int n1=0, n2=0; + + /* Extract the two arguments from standard input */ + scanf("%d&%d", &n1, &n2); + + /* Make the response body */ + sprintf(content, "Welcome to add.com: "); + sprintf(content, "%sTHE Internet addition portal.\r\n

", content); + sprintf(content, "%sThe answer is: %d + %d = %d\r\n

", + content, n1, n2, n1 + n2); + sprintf(content, "%sThanks for visiting!\r\n", content); + + /* Generate the HTTP response */ + printf("Content-length: %d\r\n", (int) strlen(content)); + printf("Content-type: text/html\r\n\r\n"); + printf("%s", content); + fflush(stdout); + exit(0); +} diff --git a/server-exp3/common.c b/server-exp3/common.c new file mode 100644 index 0000000..8c27c5b --- /dev/null +++ b/server-exp3/common.c @@ -0,0 +1,243 @@ +/* $begin common.c */ + +#include "common.h" + + + +/********************************************************************* + * The Rio package - robust I/O functions + **********************************************************************/ +/* + * rio_readn - robustly read n bytes (unbuffered) + */ +/* $begin rio_readn */ +ssize_t rio_readn(int fd, void *usrbuf, size_t n) +{ + size_t nleft = n; + ssize_t nread; + char *bufp = usrbuf; + + while (nleft > 0) { + if ((nread = read(fd, bufp, nleft)) < 0) { + if (errno == EINTR) /* interrupted by sig handler return */ + nread = 0; /* and call read() again */ + else + return -1; /* errno set by read() */ + } + else if (nread == 0) + break; /* EOF */ + nleft -= nread; + bufp += nread; + } + return (n - nleft); /* return >= 0 */ +} +/* $end rio_readn */ + +/* + * rio_writen - robustly write n bytes (unbuffered) + */ +/* $begin rio_writen */ +ssize_t rio_writen(int fd, void *usrbuf, size_t n) +{ + size_t nleft = n; + ssize_t nwritten; + char *bufp = usrbuf; + + while (nleft > 0) { + if ((nwritten = write(fd, bufp, nleft)) <= 0) { + if (errno == EINTR) /* interrupted by sig handler return */ + nwritten = 0; /* and call write() again */ + else + return -1; /* errorno set by write() */ + } + nleft -= nwritten; + bufp += nwritten; + } + return n; +} +/* $end rio_writen */ + + +/* + * rio_read - This is a wrapper for the Unix read() function that + * transfers min(n, rio_cnt) bytes from an internal buffer to a user + * buffer, where n is the number of bytes requested by the user and + * rio_cnt is the number of unread bytes in the internal buffer. On + * entry, rio_read() refills the internal buffer via a call to + * read() if the internal buffer is empty. + */ +/* $begin rio_read */ +static ssize_t rio_read(rio_t *rp, char *usrbuf, size_t n) +{ + int cnt; + + while (rp->rio_cnt <= 0) { /* refill if buf is empty */ + rp->rio_cnt = read(rp->rio_fd, rp->rio_buf, + sizeof(rp->rio_buf)); + if (rp->rio_cnt < 0) { + if (errno != EINTR) /* interrupted by sig handler return */ + return -1; + } + else if (rp->rio_cnt == 0) /* EOF */ + return 0; + else + rp->rio_bufptr = rp->rio_buf; /* reset buffer ptr */ + } + + /* Copy min(n, rp->rio_cnt) bytes from internal buf to user buf */ + cnt = n; + if (rp->rio_cnt < n) + cnt = rp->rio_cnt; + memcpy(usrbuf, rp->rio_bufptr, cnt); + rp->rio_bufptr += cnt; + rp->rio_cnt -= cnt; + return cnt; +} +/* $end rio_read */ + +/* + * rio_readinitb - Associate a descriptor with a read buffer and reset buffer + */ +/* $begin rio_readinitb */ +void rio_readinitb(rio_t *rp, int fd) +{ + rp->rio_fd = fd; + rp->rio_cnt = 0; + rp->rio_bufptr = rp->rio_buf; +} +/* $end rio_readinitb */ + +/* + * rio_readnb - Robustly read n bytes (buffered) + */ +/* $begin rio_readnb */ +ssize_t rio_readnb(rio_t *rp, void *usrbuf, size_t n) +{ + size_t nleft = n; + ssize_t nread; + char *bufp = usrbuf; + + while (nleft > 0) { + if ((nread = rio_read(rp, bufp, nleft)) < 0) { + if (errno == EINTR) /* interrupted by sig handler return */ + nread = 0; /* call read() again */ + else + return -1; /* errno set by read() */ + } + else if (nread == 0) + break; /* EOF */ + nleft -= nread; + bufp += nread; + } + return (n - nleft); /* return >= 0 */ +} +/* $end rio_readnb */ + +/* + * rio_readlineb - robustly read a text line (buffered) + */ +/* $begin rio_readlineb */ +ssize_t rio_readlineb(rio_t *rp, void *usrbuf, size_t maxlen) +{ + int n, rc; + char c, *bufp = usrbuf; + + for (n = 1; n < maxlen; n++) { + if ((rc = rio_read(rp, &c, 1)) == 1) { + *bufp++ = c; + if (c == '\n') + break; + } else if (rc == 0) { + if (n == 1) + return 0; /* EOF, no data read */ + else + break; /* EOF, some data was read */ + } else + return -1; /* error */ + } + *bufp = 0; + return n; +} +/* $end rio_readlineb */ + +/********************************** + * Wrappers for robust I/O routines + **********************************/ + + +/******************************** + * Client/server helper functions + ********************************/ +/* + * open_client_sock - open connection to server at + * and return a socket descriptor ready for reading and writing. + * Returns -1 and sets errno on Unix error. + * Returns -2 and sets h_errno on DNS (gethostbyname) error. + */ +/* $begin open_client_sock */ +int open_client_sock(char *hostname, int port) +{ + int client_sock; + struct hostent *hp; + struct sockaddr_in serveraddr; + + if ((client_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) + return -1; /* check errno for cause of error */ + + /* Fill in the server's IP address and port */ + if ((hp = gethostbyname(hostname)) == NULL) + 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); + serveraddr.sin_port = htons(port); + + /* Establish a connection with the server */ + if (connect(client_sock, (SA *) &serveraddr, sizeof(serveraddr)) < 0) + return -1; + return client_sock; +} +/* $end open_client_sock */ + +/* + * open_listen_sock - open and return a listening socket on port + * Returns -1 and sets errno on Unix error. + */ +/* $begin open_listen_sock */ +int open_listen_sock(int port) +{ + int listen_sock, optval=1; + struct sockaddr_in serveraddr; + + /* Create a socket descriptor */ + if ((listen_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) + return -1; + + /* Eliminates "Address already in use" error from bind. */ + if (setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, + (const void *)&optval , sizeof(int)) < 0) + return -1; + + /* Listen_sock will be an endpoint for all requests to port + on any IP address for this host */ + bzero((char *) &serveraddr, sizeof(serveraddr)); + serveraddr.sin_family = AF_INET; + serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); + serveraddr.sin_port = htons((unsigned short)port); + if (bind(listen_sock, (SA *)&serveraddr, sizeof(serveraddr)) < 0) + return -1; + + /* Make it a listening socket ready to accept connection requests */ + if (listen(listen_sock, LISTENQ) < 0) + return -1; + return listen_sock; +} +/* $end open_listen_sock */ + + +/* $end wrapper.c */ + + + + diff --git a/server-exp3/common.h b/server-exp3/common.h new file mode 100644 index 0000000..edc667c --- /dev/null +++ b/server-exp3/common.h @@ -0,0 +1,78 @@ +/* $begin common.h */ +#ifndef __COMMON_H__ +#define __COMMON_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Default file permissions are DEF_MODE & ~DEF_UMASK */ +/* $begin createmasks */ +#define DEF_MODE S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH +#define DEF_UMASK S_IWGRP|S_IWOTH +/* $end createmasks */ + +/* Simplifies calls to bind(), connect(), and accept() */ +/* $begin sockaddrdef */ +typedef struct sockaddr SA; +/* $end sockaddrdef */ + +/* Persistent state for the robust I/O (Rio) package */ +/* $begin rio_t */ +#define RIO_BUFSIZE 8192 +typedef struct { + int rio_fd; /* descriptor for this internal buf */ + int rio_cnt; /* unread bytes in internal buf */ + char *rio_bufptr; /* next unread byte in internal buf */ + char rio_buf[RIO_BUFSIZE]; /* internal buffer */ +} rio_t; +/* $end rio_t */ + +/* External variables */ +extern int h_errno; /* defined by BIND for DNS errors */ +extern char **environ; /* defined by libc */ + +/* Misc constants */ +#define MAXLINE 8192 /* max text line length */ +#define MAXBUF 8192 /* max I/O buffer size */ +#define LISTENQ 1024 /* second argument to listen() */ + +/* Rio (Robust I/O) package */ +ssize_t rio_readn(int fd, void *usrbuf, size_t n); +ssize_t rio_writen(int fd, void *usrbuf, size_t n); +void rio_readinitb(rio_t *rp, int fd); +ssize_t rio_readnb(rio_t *rp, void *usrbuf, size_t n); +ssize_t rio_readlineb(rio_t *rp, void *usrbuf, size_t maxlen); + +/* Client/server helper functions */ +int open_client_sock(char *hostname, int portno); +int open_listen_sock(int portno); + +#endif /* __COMMON_H__ */ +/* $end common.h */ diff --git a/server-exp3/example.jpg b/server-exp3/example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3b0913844a3882dfcc7a4ad27afecea541e3ef34 GIT binary patch literal 193852 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

9AML4E&LZ-py03uPmF%q7sVy# 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

hI1cuu&m8>`jWWf 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 u)Y7KyQ+`t5 ~Olu8ZKR_nc?!eDvgW678?8HzOOT71D&DYw$$^Y4xRBed> literal 0 HcmV?d00001 diff --git a/server-exp3/favicon.ico b/server-exp3/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b8c2f89625bf042f77e19752adf29b7b2ec47adf GIT binary patch literal 16166 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 R(_ZuZd+7gv{{N-~{s&G6BE + + + the example web + + +

webserver test page

+

+ Not pretty but should prove that webserver works:-) +

+ + + diff --git a/server-exp3/run.log b/server-exp3/run.log new file mode 100644 index 0000000..1212f43 --- /dev/null +++ b/server-exp3/run.log @@ -0,0 +1,7 @@ +235735 fetches, 5 max parallel, 4.51969e+07 bytes, in 20 seconds +191.728 mean bytes/connection +11786.7 fetches/sec, 2.25985e+06 bytes/sec +msecs/connect: 0.0682447 mean, 1.824 max, 0.018 min +msecs/first-response: 0.323851 mean, 2.544 max, 0.054 min +HTTP response codes: + code 200 -- 235735 diff --git a/server-exp3/server_pool.log b/server-exp3/server_pool.log new file mode 100644 index 0000000..e69de29 diff --git a/server-exp3/t1.txt b/server-exp3/t1.txt new file mode 100644 index 0000000..f885819 --- /dev/null +++ b/server-exp3/t1.txt @@ -0,0 +1,6 @@ +hello +world +dgut +computer +Hello +WORLD diff --git a/server-exp3/t2.txt b/server-exp3/t2.txt new file mode 100644 index 0000000..f885819 --- /dev/null +++ b/server-exp3/t2.txt @@ -0,0 +1,6 @@ +hello +world +dgut +computer +Hello +WORLD diff --git a/server-exp3/test.html b/server-exp3/test.html new file mode 100644 index 0000000..9161126 --- /dev/null +++ b/server-exp3/test.html @@ -0,0 +1,8 @@ + + +a simple page for testing tiny + + +Hello World + + \ No newline at end of file diff --git a/server-exp3/thpool.c b/server-exp3/thpool.c new file mode 100644 index 0000000..1b4d079 --- /dev/null +++ b/server-exp3/thpool.c @@ -0,0 +1,474 @@ +/* ******************************** + * Author: Johan Hanssen Seferidis + * License: MIT + * Description: Library providing a threading pool where you can add + * work. For usage, check the thpool.h file or README.md + * + */ +/** @file thpool.h */ /* + * + ********************************/ + +#if defined(__APPLE__) +#include +#else +#ifndef _POSIX_C_SOURCE +#define _POSIX_C_SOURCE 200809L +#endif +#ifndef _XOPEN_SOURCE +#define _XOPEN_SOURCE 500 +#endif +#endif +#include +#include +#include +#include +#include +#include +#include +#if defined(__linux__) +#include +#endif +#if defined(__FreeBSD__) || defined(__OpenBSD__) +#include +#endif + +#include "thpool.h" + +#ifdef THPOOL_DEBUG +#define THPOOL_DEBUG 1 +#else +#define THPOOL_DEBUG 0 +#endif + +#if !defined(DISABLE_PRINT) || defined(THPOOL_DEBUG) +#define err(str) fprintf(stderr, str) +#else +#define err(str) +#endif + +#ifndef THPOOL_THREAD_NAME +#define THPOOL_THREAD_NAME thpool +#endif + +#define STRINGIFY(x) #x +#define TOSTRING(x) STRINGIFY(x) + +static volatile int threads_keepalive; +static volatile int threads_on_hold; + +/* ========================== STRUCTURES ============================ */ + + +/* ========================== PROTOTYPES ============================ */ + +static int thread_init(thpool_* thpool_p, struct thread** thread_p, int id); +static void* thread_do(struct thread* thread_p); +static void thread_hold(int sig_id); +static void thread_destroy(struct thread* thread_p); + +static int jobqueue_init(jobqueue* jobqueue_p); +static void jobqueue_clear(jobqueue* jobqueue_p); +static void jobqueue_push(jobqueue* jobqueue_p, struct job* newjob_p); +static struct job* jobqueue_pull(jobqueue* jobqueue_p); +static void jobqueue_destroy(jobqueue* jobqueue_p); + +static void bsem_init(struct bsem* bsem_p, int value); +static void bsem_reset(struct bsem* bsem_p); +static void bsem_post(struct bsem* bsem_p); +static void bsem_post_all(struct bsem* bsem_p); +static void bsem_wait(struct bsem* bsem_p); + +/* ========================== THREADPOOL ============================ */ + +/* Initialise thread pool */ +struct thpool_* thpool_init(int num_threads) { + threads_on_hold = 0; + threads_keepalive = 1; + + if (num_threads < 0) { + num_threads = 0; + } + + /* Make new thread pool */ + thpool_* thpool_p; + thpool_p = (struct thpool_*)malloc(sizeof(struct thpool_)); + if (thpool_p == NULL) { + err("thpool_init(): Could not allocate memory for thread pool\n"); + return NULL; + } + thpool_p->num_threads_alive = 0; + thpool_p->num_threads_working = 0; + + /* Initialise the job queue */ + if (jobqueue_init(&thpool_p->jobqueue) == -1) { + err("thpool_init(): Could not allocate memory for job queue\n"); + free(thpool_p); + return NULL; + } + + /* Make threads in pool */ + thpool_p->threads = (struct thread**)malloc(num_threads * sizeof(struct thread*)); + if (thpool_p->threads == NULL) { + err("thpool_init(): Could not allocate memory for threads\n"); + jobqueue_destroy(&thpool_p->jobqueue); + free(thpool_p); + return NULL; + } + + pthread_mutex_init(&(thpool_p->thcount_lock), NULL); + pthread_cond_init(&thpool_p->threads_all_idle, NULL); + + /* Thread init */ + int n; + for (n = 0; n < num_threads; n++) { + thread_init(thpool_p, &thpool_p->threads[n], n); +#if THPOOL_DEBUG + printf("THPOOL_DEBUG: Created thread %d in pool \n", n); +#endif + } + + /* Wait for threads to initialize */ + while (thpool_p->num_threads_alive != num_threads) { + } + + return thpool_p; +} + +/* Add work to the thread pool */ +int thpool_add_work(thpool_* thpool_p, void (*function_p)(void*), void* arg_p) { + job* newjob; + + newjob = (struct job*)malloc(sizeof(struct job)); + if (newjob == NULL) { + err("thpool_add_work(): Could not allocate memory for new job\n"); + return -1; + } + + /* add function and argument */ + newjob->function = function_p; + newjob->arg = arg_p; + + /* add job to queue */ + jobqueue_push(&thpool_p->jobqueue, newjob); + + return 0; +} + +/* Wait until all jobs have finished */ +void thpool_wait(thpool_* thpool_p) { + pthread_mutex_lock(&thpool_p->thcount_lock); + while (thpool_p->jobqueue.len || thpool_p->num_threads_working) { + pthread_cond_wait(&thpool_p->threads_all_idle, &thpool_p->thcount_lock); + } + pthread_mutex_unlock(&thpool_p->thcount_lock); +} + +/* Destroy the threadpool */ +void thpool_destroy(thpool_* thpool_p) { + /* No need to destroy if it's NULL */ + if (thpool_p == NULL) return; + + volatile int threads_total = thpool_p->num_threads_alive; + + /* End each thread 's infinite loop */ + threads_keepalive = 0; + + /* Give one second to kill idle threads */ + double TIMEOUT = 1.0; + time_t start, end; + double tpassed = 0.0; + time(&start); + while (tpassed < TIMEOUT && thpool_p->num_threads_alive) { + bsem_post_all(thpool_p->jobqueue.has_jobs); + time(&end); + tpassed = difftime(end, start); + } + + /* Poll remaining threads */ + while (thpool_p->num_threads_alive) { + bsem_post_all(thpool_p->jobqueue.has_jobs); + sleep(1); + } + + /* Job queue cleanup */ + jobqueue_destroy(&thpool_p->jobqueue); + /* Deallocs */ + int n; + for (n = 0; n < threads_total; n++) { + thread_destroy(thpool_p->threads[n]); + } + free(thpool_p->threads); + free(thpool_p); +} + +/* Pause all threads in threadpool */ +void thpool_pause(thpool_* thpool_p) { + int n; + for (n = 0; n < thpool_p->num_threads_alive; n++) { + pthread_kill(thpool_p->threads[n]->pthread, SIGUSR1); + } +} + +/* Resume all threads in threadpool */ +void thpool_resume(thpool_* thpool_p) { + // resuming a single threadpool hasn't been + // implemented yet, meanwhile this suppresses + // the warnings + (void)thpool_p; + + threads_on_hold = 0; +} + +int thpool_num_threads_working(thpool_* thpool_p) { return thpool_p->num_threads_working; } + +/* ============================ THREAD ============================== */ + +/* Initialize a thread in the thread pool + * + * @param thread address to the pointer of the thread to be created + * @param id id to be given to the thread + * @return 0 on success, -1 otherwise. + */ +static int thread_init(thpool_* thpool_p, struct thread** thread_p, int id) { + *thread_p = (struct thread*)malloc(sizeof(struct thread)); + if (*thread_p == NULL) { + err("thread_init(): Could not allocate memory for thread\n"); + return -1; + } + + (*thread_p)->thpool_p = thpool_p; + (*thread_p)->id = id; + + pthread_create(&(*thread_p)->pthread, NULL, (void* (*)(void*))thread_do, (*thread_p)); + pthread_detach((*thread_p)->pthread); + return 0; +} + +/* Sets the calling thread on hold */ +static void thread_hold(int sig_id) { + (void)sig_id; + threads_on_hold = 1; + while (threads_on_hold) { + sleep(1); + } +} + +/* What each thread is doing + * + * In principle this is an endless loop. The only time this loop gets interrupted is once + * thpool_destroy() is invoked or the program exits. + * + * @param thread thread that will run this function + * @return nothing + */ +static void* thread_do(struct thread* thread_p) { + /* Set thread name for profiling and debugging */ + char thread_name[16] = {0}; + + snprintf(thread_name, 16, TOSTRING(THPOOL_THREAD_NAME) "-%d", thread_p->id); + +#if defined(__linux__) + /* Use prctl instead to prevent using _GNU_SOURCE flag and implicit declaration */ + prctl(PR_SET_NAME, thread_name); +#elif defined(__APPLE__) && defined(__MACH__) + pthread_setname_np(thread_name); +#elif defined(__FreeBSD__) || defined(__OpenBSD__) + pthread_set_name_np(thread_p->pthread, thread_name); +#else + err("thread_do(): pthread_setname_np is not supported on this system"); +#endif + + /* Assure all threads have been created before starting serving */ + thpool_* thpool_p = thread_p->thpool_p; + + /* Register signal handler */ + struct sigaction act; + sigemptyset(&act.sa_mask); + act.sa_flags = SA_ONSTACK; + act.sa_handler = thread_hold; + if (sigaction(SIGUSR1, &act, NULL) == -1) { + err("thread_do(): cannot handle SIGUSR1"); + } + + /* Mark thread as alive (initialized) */ + pthread_mutex_lock(&thpool_p->thcount_lock); + thpool_p->num_threads_alive += 1; + pthread_mutex_unlock(&thpool_p->thcount_lock); + + while (threads_keepalive) { + bsem_wait(thpool_p->jobqueue.has_jobs); + + if (threads_keepalive) { + pthread_mutex_lock(&thpool_p->thcount_lock); + thpool_p->num_threads_working++; + pthread_mutex_unlock(&thpool_p->thcount_lock); + + /* Read job from queue and execute it */ + void (*func_buff)(void*); + void* arg_buff; + job* job_p = jobqueue_pull(&thpool_p->jobqueue); + if (job_p) { + #ifdef DEBUG + printf("线程%d开始处理\n",thread_p->id); + #endif + func_buff = job_p->function; + arg_buff = job_p->arg; + func_buff(arg_buff); + + #ifdef DEBUG + printf("线程%d处理完成\n",thread_p->id); + #endif + free(job_p); + } + + pthread_mutex_lock(&thpool_p->thcount_lock); + thpool_p->num_threads_working--; + if (!thpool_p->num_threads_working) { + pthread_cond_signal(&thpool_p->threads_all_idle); + } + pthread_mutex_unlock(&thpool_p->thcount_lock); + } + } + pthread_mutex_lock(&thpool_p->thcount_lock); + thpool_p->num_threads_alive--; + pthread_mutex_unlock(&thpool_p->thcount_lock); + + return NULL; +} + +/* Frees a thread */ +static void thread_destroy(thread* thread_p) { free(thread_p); } + +/* ============================ JOB QUEUE =========================== */ + +/* Initialize queue */ +static int jobqueue_init(jobqueue* jobqueue_p) { + jobqueue_p->len = 0; + jobqueue_p->front = NULL; + jobqueue_p->rear = NULL; + + jobqueue_p->has_jobs = (struct bsem*)malloc(sizeof(struct bsem)); + if (jobqueue_p->has_jobs == NULL) { + return -1; + } + + pthread_mutex_init(&(jobqueue_p->rwmutex), NULL); + bsem_init(jobqueue_p->has_jobs, 0); + + return 0; +} + +/* Clear the queue */ +static void jobqueue_clear(jobqueue* jobqueue_p) { + while (jobqueue_p->len) { + free(jobqueue_pull(jobqueue_p)); + } + + jobqueue_p->front = NULL; + jobqueue_p->rear = NULL; + bsem_reset(jobqueue_p->has_jobs); + jobqueue_p->len = 0; +} + +/* Add (allocated) job to queue + */ +static void jobqueue_push(jobqueue* jobqueue_p, struct job* newjob) { + pthread_mutex_lock(&jobqueue_p->rwmutex); + newjob->prev = NULL; + + switch (jobqueue_p->len) { + case 0: /* if no jobs in queue */ + jobqueue_p->front = newjob; + jobqueue_p->rear = newjob; + break; + + default: /* if jobs in queue */ + jobqueue_p->rear->prev = newjob; + jobqueue_p->rear = newjob; + } + jobqueue_p->len++; + + bsem_post(jobqueue_p->has_jobs); + pthread_mutex_unlock(&jobqueue_p->rwmutex); +} + +/* Get first job from queue(removes it from queue) + * Notice: Caller MUST hold a mutex + */ +static struct job* jobqueue_pull(jobqueue* jobqueue_p) { + pthread_mutex_lock(&jobqueue_p->rwmutex); + job* job_p = jobqueue_p->front; + + switch (jobqueue_p->len) { + case 0: /* if no jobs in queue */ + break; + + case 1: /* if one job in queue */ + jobqueue_p->front = NULL; + jobqueue_p->rear = NULL; + jobqueue_p->len = 0; + break; + + default: /* if >1 jobs in queue */ + jobqueue_p->front = job_p->prev; + jobqueue_p->len--; + /* more than one job in queue -> post it */ + bsem_post(jobqueue_p->has_jobs); + } + + pthread_mutex_unlock(&jobqueue_p->rwmutex); + return job_p; +} + +/* Free all queue resources back to the system */ +static void jobqueue_destroy(jobqueue* jobqueue_p) { + jobqueue_clear(jobqueue_p); + free(jobqueue_p->has_jobs); +} + +/* ======================== SYNCHRONISATION ========================= */ + +/* Init semaphore to 1 or 0 */ +static void bsem_init(bsem* bsem_p, int value) { + if (value < 0 || value > 1) { + err("bsem_init(): Binary semaphore can take only values 1 or 0"); + exit(1); + } + pthread_mutex_init(&(bsem_p->mutex), NULL); + pthread_cond_init(&(bsem_p->cond), NULL); + bsem_p->v = value; +} + +/* Reset semaphore to 0 */ +static void bsem_reset(bsem* bsem_p) { + pthread_mutex_destroy(&(bsem_p->mutex)); + pthread_cond_destroy(&(bsem_p->cond)); + bsem_init(bsem_p, 0); +} + +/* Post to at least one thread */ +static void bsem_post(bsem* bsem_p) { + pthread_mutex_lock(&bsem_p->mutex); + bsem_p->v = 1; + pthread_cond_signal(&bsem_p->cond); + pthread_mutex_unlock(&bsem_p->mutex); +} + +/* Post to all threads */ +static void bsem_post_all(bsem* bsem_p) { + pthread_mutex_lock(&bsem_p->mutex); + bsem_p->v = 1; + pthread_cond_broadcast(&bsem_p->cond); + pthread_mutex_unlock(&bsem_p->mutex); +} + +/* Wait on semaphore until semaphore has value 0 */ +static void bsem_wait(bsem* bsem_p) { + pthread_mutex_lock(&bsem_p->mutex); + while (bsem_p->v != 1) { + pthread_cond_wait(&bsem_p->cond, &bsem_p->mutex); + } + bsem_p->v = 0; + pthread_mutex_unlock(&bsem_p->mutex); +} diff --git a/server-exp3/thpool.h b/server-exp3/thpool.h new file mode 100644 index 0000000..ab25dfc --- /dev/null +++ b/server-exp3/thpool.h @@ -0,0 +1,222 @@ +/********************************** + * @author Johan Hanssen Seferidis + * License: MIT + * + **********************************/ + +#ifndef _THPOOL_ +#define _THPOOL_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* =================================== API ======================================= */ + +/* ========================== STRUCTURES ============================ */ + +/* Binary semaphore */ +typedef struct bsem { + pthread_mutex_t mutex; + pthread_cond_t cond; + int v; +} bsem; + +/* Job */ +typedef struct job { + struct job* prev; /* pointer to previous job */ + void (*function)(void* arg); /* function pointer */ + void* arg; /* function's argument */ +} job; + +/* Job queue */ +typedef struct jobqueue { + pthread_mutex_t rwmutex; /* used for queue r/w access */ + job* front; /* pointer to front of queue */ + job* rear; /* pointer to rear of queue */ + bsem* has_jobs; /* flag as binary semaphore */ + int len; /* number of jobs in queue */ +} jobqueue; + +/* Thread */ +typedef struct thread { + int id; /* friendly id */ + pthread_t pthread; /* pointer to actual thread */ + struct thpool_* thpool_p; /* access to thpool */ +} thread; + +/* Threadpool */ +typedef struct thpool_ { + thread** threads; /* pointer to threads */ + volatile int num_threads_alive; /* threads currently alive */ + volatile int num_threads_working; /* threads currently working */ + pthread_mutex_t thcount_lock; /* used for thread count etc */ + pthread_cond_t threads_all_idle; /* signal to thpool_wait */ + jobqueue jobqueue; /* job queue */ +} thpool_; + +typedef struct thpool_* threadpool; + +/** + * @brief Initialize threadpool + * + * Initializes a threadpool. This function will not return until all + * threads have initialized successfully. + * + * @example + * + * .. + * threadpool thpool; //First we declare a threadpool + * thpool = thpool_init(4); //then we initialize it to 4 threads + * .. + * + * @param num_threads number of threads to be created in the threadpool + * @return threadpool created threadpool on success, + * NULL on error + */ +threadpool thpool_init(int num_threads); + +/** + * @brief Add work to the job queue + * + * Takes an action and its argument and adds it to the threadpool's job queue. + * If you want to add to work a function with more than one arguments then + * a way to implement this is by passing a pointer to a structure. + * + * NOTICE: You have to cast both the function and argument to not get warnings. + * + * @example + * + * void print_num(int num){ + * printf("%d\n", num); + * } + * + * int main() { + * .. + * int a = 10; + * thpool_add_work(thpool, (void*)print_num, (void*)a); + * .. + * } + * + * @param threadpool threadpool to which the work will be added + * @param function_p pointer to function to add as work + * @param arg_p pointer to an argument + * @return 0 on success, -1 otherwise. + */ +int thpool_add_work(threadpool, void (*function_p)(void*), void* arg_p); + +/** + * @brief Wait for all queued jobs to finish + * + * Will wait for all jobs - both queued and currently running to finish. + * Once the queue is empty and all work has completed, the calling thread + * (probably the main program) will continue. + * + * Smart polling is used in wait. The polling is initially 0 - meaning that + * there is virtually no polling at all. If after 1 seconds the threads + * haven't finished, the polling interval starts growing exponentially + * until it reaches max_secs seconds. Then it jumps down to a maximum polling + * interval assuming that heavy processing is being used in the threadpool. + * + * @example + * + * .. + * threadpool thpool = thpool_init(4); + * .. + * // Add a bunch of work + * .. + * thpool_wait(thpool); + * puts("All added work has finished"); + * .. + * + * @param threadpool the threadpool to wait for + * @return nothing + */ +void thpool_wait(threadpool); + +/** + * @brief Pauses all threads immediately + * + * The threads will be paused no matter if they are idle or working. + * The threads return to their previous states once thpool_resume + * is called. + * + * While the thread is being paused, new work can be added. + * + * @example + * + * threadpool thpool = thpool_init(4); + * thpool_pause(thpool); + * .. + * // Add a bunch of work + * .. + * thpool_resume(thpool); // Let the threads start their magic + * + * @param threadpool the threadpool where the threads should be paused + * @return nothing + */ +void thpool_pause(threadpool); + +/** + * @brief Unpauses all threads if they are paused + * + * @example + * .. + * thpool_pause(thpool); + * sleep(10); // Delay execution 10 seconds + * thpool_resume(thpool); + * .. + * + * @param threadpool the threadpool where the threads should be unpaused + * @return nothing + */ +void thpool_resume(threadpool); + +/** + * @brief Destroy the threadpool + * + * This will wait for the currently active threads to finish and then 'kill' + * the whole threadpool to free up memory. + * + * @example + * int main() { + * threadpool thpool1 = thpool_init(2); + * threadpool thpool2 = thpool_init(2); + * .. + * thpool_destroy(thpool1); + * .. + * return 0; + * } + * + * @param threadpool the threadpool to destroy + * @return nothing + */ +void thpool_destroy(threadpool); + +/** + * @brief Show currently working threads + * + * Working threads are the threads that are performing work (not idle). + * + * @example + * int main() { + * threadpool thpool1 = thpool_init(2); + * threadpool thpool2 = thpool_init(2); + * .. + * printf("Working threads: %d\n", thpool_num_threads_working(thpool1)); + * .. + * return 0; + * } + * + * @param threadpool the threadpool of interest + * @return integer number of threads working + */ +int thpool_num_threads_working(threadpool); +threadpool* initThreadPool(int); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/server-exp3/togglec b/server-exp3/togglec new file mode 100755 index 0000000000000000000000000000000000000000..65cd6f33854b485f136c6192bab6960b3022f033 GIT binary patch literal 25360 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,&lsz{24A0{%z&h1ZOQ|a2JS-AuA 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 literal 0 HcmV?d00001 diff --git a/server-exp3/togglec.c b/server-exp3/togglec.c new file mode 100644 index 0000000..f3dceb0 --- /dev/null +++ b/server-exp3/togglec.c @@ -0,0 +1,30 @@ +#include "common.h" + +int main(int argc, char **argv) +{ + int client_sock, port; + char *host, buf[MAXLINE]; + rio_t rio; + + if (argc != 3) { + fprintf(stderr, "usage: %s \n", argv[0]); + exit(1); + } + host = argv[1]; + port = atoi(argv[2]); + + client_sock = open_client_sock(host, port); + if(client_sock==-1) { + fputs("Error to connect the Server\n",stdout); + exit(1); + } + + while (fgets(buf, MAXLINE, stdin) != NULL) { + //sleep(1); + send(client_sock, buf, strlen(buf),0); + recv(client_sock, buf, MAXLINE,0); + fputs(buf, stdout); + } + close(client_sock); + exit(0); +} diff --git a/server-exp3/togglecm b/server-exp3/togglecm new file mode 100644 index 0000000..582f702 --- /dev/null +++ b/server-exp3/togglecm @@ -0,0 +1,6 @@ +for i in {1..20} +do + ./togglec localhost 12345 < $1 + sleep 1 +done + diff --git a/server-exp3/togglest_pool b/server-exp3/togglest_pool new file mode 100755 index 0000000000000000000000000000000000000000..d794cc4cef04495097d4512ca171c8a811554b8d GIT binary patch literal 47424 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 literal 0 HcmV?d00001 diff --git a/server-exp3/togglest_pool.c b/server-exp3/togglest_pool.c new file mode 100644 index 0000000..62d0612 --- /dev/null +++ b/server-exp3/togglest_pool.c @@ -0,0 +1,113 @@ +#include "common.h" +#include "thpool.h" + +#define NTHREADS 4 +#define SBUFSIZE 16 + +typedef struct _param { + int hit; + int conn_sock; +} param; + +void toggle(int conn_sock,int hit); +void handle_request( void *arg) ; + +void toggle(int conn_sock,int hit) +{ + size_t n; int i,no=0; + char buf[MAXLINE]; + + + while((n =recv(conn_sock, buf, MAXLINE,0))> 0) { + printf("toggle服务器收到第%d个客户第%d个消息,长度为%d字节\n", hit,++no,(int)n); + + for(i=0; iconn_sock; + int hit = datap->hit; + + printf("第%d个客户通信开始\n",hit); + //usleep(1); + toggle(conn_sock,hit); + printf("第%d个客户通信结束\n",hit); + + free(arg); + close(conn_sock); +} + +//主函数 +int main(int argc, char **argv) { + + int listen_sock, conn_sock, port,i; + struct sockaddr_in clientaddr; + struct hostent *hp; + char *haddrp; + int hit; + + int nth[NTHREADS]; + + socklen_t clientlen=sizeof(struct sockaddr_in); + + if (argc != 2) { + fprintf(stderr, "usage: %s \n", argv[0]); + exit(1); + } + + listen_sock = open_listen_sock(port); + if( listen_sock==-1) { + printf("端口号%d繁忙\n",port); + exit(1); + } + + port = atoi(argv[1]); + + listen_sock = open_listen_sock(port); + if( listen_sock==-1) { + printf("端口号%d繁忙\n",port); + exit(1); + } + + printf("start main\n"); + // 初始化线程池 + thpool_* pool = thpool_init(NTHREADS); + + // 创建示例任务并将其添加到线程池 + for (hit=1; ; hit++) { + conn_sock = accept(listen_sock, (SA *) &clientaddr, &clientlen); + + //determine the domain name and IP address of the client + hp = gethostbyaddr((const char *)&clientaddr.sin_addr.s_addr, + sizeof(clientaddr.sin_addr.s_addr), AF_INET); + haddrp = inet_ntoa(clientaddr.sin_addr); + //printf("server connected to %s (%s)\n", hp->h_name, haddrp); + + param *new_param = (param*) malloc(sizeof(param)); + + new_param->hit = hit; + new_param->conn_sock=conn_sock; + + thpool_add_work(pool,handle_request, (void*)new_param); + } + + // 等待线程池中的所有任务执行完毕 + thpool_wait(pool); + + // 销毁线程池 + thpool_destroy(pool); + + printf("stop main\n"); + return 0; +} diff --git a/server-exp3/urls b/server-exp3/urls new file mode 100644 index 0000000..7ab9998 --- /dev/null +++ b/server-exp3/urls @@ -0,0 +1,2 @@ +http://127.0.0.1:9999/index.html +http://127.0.0.1:9999/test.html diff --git a/server-exp3/webclient b/server-exp3/webclient new file mode 100755 index 0000000000000000000000000000000000000000..2a386ff38d3295fb48c5f3d0070a35a58fe04f4c GIT binary patch literal 20336 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 // 提供IP地址转换函数 +#include // 提供套接字地址结构定义 +#include // 标准输入输出 +#include // 标准库函数,如exit() +#include // 字符串操作函数 +#include // 套接字相关函数 +#include // 数据类型定义 +#include // POSIX API,如read()和write() + +//#define PORT 8181 /* 目标服务器的端口号 */ +//#define IP_ADDRESS "192.168.0.8" /* 目标服务器的IP地址 */ +#define BUFSIZE 8196 /* 缓冲区大小 */ + +char *command = "GET /index.html HTTP/1.0 \r\n\r\n"; /* HTTP GET 请求命令 */ + +// 错误处理函数,打印错误信息并退出程序 +void pexit(char *msg) { + perror(msg); // 打印错误信息 + exit(1); // 退出程序 +} + +int main(int argc, char *argv[]) {//客户端启动命令为"./client 127.0.0.1 8088",argv[1]是IP地址,argv[2]是端口号8088 + int i, sockfd; // sockfd是套接字文件描述符 + char buffer[BUFSIZE]; // 用于存储从服务器接收的数据 + struct sockaddr_in serv_addr; // 定义服务器地址结构 + + // 打印尝试连接服务器的信息 + printf("客户端尝试连接到 %s 和端口 %s\n", argv[1], argv[2]); + + // 创建套接字,使用IPv4和TCP协议 + if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) pexit("socket() 创建失败"); + + // 配置服务器地址 + serv_addr.sin_family = AF_INET; // 地址族为IPv4 + serv_addr.sin_addr.s_addr = inet_addr(argv[1]); // 设置服务器IP地址,如"127.0.0.1" + serv_addr.sin_port = htons(atoi(argv[2])); // 设置服务器端口号,如"8088" + + // 尝试连接到服务器 + if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) + pexit("connect() 连接失败"); + + // 发送HTTP GET请求到服务器 + printf("发送字节数=%ld %s\n", strlen(command), command); + if (write(sockfd, command, strlen(command)) < 0) pexit("write() 发送请求失败"); + + // 循环读取服务器返回的数据,并输出到标准输出 + while ((i = read(sockfd, buffer, BUFSIZE)) > 0) { + if (write(1, buffer, i) < 0) // 1表示标准输出 + pexit("write() 输出到标准输出失败"); + } + + // 关闭套接字,释放资源 + close(sockfd); + return 0; // 程序正常退出 +} diff --git a/server-exp3/webserver b/server-exp3/webserver new file mode 100755 index 0000000000000000000000000000000000000000..57071ac13adaa9ff8cf2e94a35935106b96c788c GIT binary patch literal 38384 zcmeHwd3;;dmH*R|o-N6?ByWkcki3MLY}k&oHH3sXiyS$t$Du-nq6Z3Y5mX400@lv0|8C1EKEZHEThfwX1X(2`&`v`tfBLJRo!J$I3wUM!~b z`~Ci!Po6)1_nvdlcF#TczI(6UvctQgR<&3Zd03U}6oT|}j;Rp^hwc^`BsIz$#f5XZ zGC|1!Y-2cHUc(cV^21}zOzi?sXyQwVa&tOb(8*L<$G_+Onssfz6l&J`BZ?!w@>ix6MQl~ zPZhx-Q|V68kb0Ztb@I zbIb4gV*iWYmaV_}{?2bZ_I$poE!;SJW>s6TqAeUrZm!roXLiNxnU(Qq<#dJG|7!e` zJZ87$4&)S-a25D}CG>LpH5a;Nx1h3&<0C*t85j;clLbEqiiV@5+L&$%3!Sg73(JKa~X!Gl%rs>MZte%tGIo1z(y)&e|;WeOd6; zS>%k$g0IaY=ZjhJuV=we$s+$ZS?FC^=x@$K|IIA;)+~4$7lw-Sky-G$+3d-J|3MZx z?`6Sn!l&&BTCD;=fQCshn=$g>pPs;*pM6IFe{q;-N%5 z+H_mABcXI86LF;@6pKY;N>dw<{+3W85pEADet$d>0Nm7io4+{_Zd00CgW(v^?a>HI zVu@sj;%{$i3k4#`HHITWr8NIeskpqUvF?EqaM5e-8xhSVmqDVFfJ2f`5$1!1?+EGpF&jwe9u z_cv`0_?yF#KwEfgNQukRXj7n#i3~I~g;4SKrf4#fpgPAv6>b5&(iDwELQN{f$uQk>ji$Z z3BOL@cbf3G2>f0XJ|OVDCj6}ezt4n^2>byPezU+IG~sU-_(LZAodSQ@gqQTE{0ch| zd@L?Gq$sBic(x7@1^os*&0*wm-hiJXkw`BZ@H8ir$LR*1BiS@hlgEKucrF)-2xW#i zXuw+~G15Z@yqv>Q@nHj=>L!n420ZDI#|Z;o_5mt8X~3g{rH)euJk8nUaoT{-lSrif z27JB&f8Kychff_B4R}`yi;VCm+3q&r?FPIYQ>fTuz>B3G<0>=Yjn_lnfG;-4pJc$( zd|e*X4ESLZiFA$uKiq(?G2qJ#c%K13!ho+g;A!q5j|~R=D2YVcV89zE{jCQ46$bha z1AdGFzuABvYryX`;B^CjuK_>KfbTWnjq{6r2K1Sm_}HUJT_7 zf7pPZXpnQvfS+W*pD^Gj8}KI$_^Af`wLlfJgfHLtXr>Bl)>^goZVw< z6ryjXl7Zh24h}Z=GMF~D23}3Wv>`n3TpFegu7StWFl}rNJd}oM(`?{#X_z*+26m-k z+8i2)rD5988fZ+zw2?KiCJoaD*1)1POdD4N)6+0*SPhI%!?aN~P?UyggK9uc!?ZCq zaN*-reQ85#;J0a*HlhYzO~bSSHSk;-rj4h8$I>uuI1N0MhH2w*;B#r1Hl7A{rD57| z8i=J~+GrYROvALnG_WQO)5g-kqBKk!N(0l=Fl{6aj8DU~fizH*hH2wyKuyDA3BK@A zs{T5`zfHrmK{W7c8m5h*f#=dNZ3qoKmWF8~XyBnVOdCK0pG(8E@iVY11rL_5ny)C$ z?y*Z07Jq}~XRpnKe{F(aGr=#L;1^BsGbZ>66a1(N{#O%xzX|@L3BJb!-)Vxko8XNm zIAVgEP4F!y_|qnMl?kpj!PlAK*(SKs1Yc!>$C%(@CfH?yb4>8Zb2HoXeG~jg6MWVL z|JnqbhRJ#n<&)U*}ur>(_a!k5#|q>zV%$hLyq6&x7>c z=1TY2-3VG9pWWI$s2`1_&-bqP_00Mq`ZwtNemOXJT#KTJ#!Fw zLXMK*{kOsi2I6V`KLD|>>tY=Y?|PBZtmr!K>q?&Xb#3eSb*(??>soor*NwE>d)hbo zIiSu11j^gb!HdYA_l1x3P*z;?M)FTU(ET9&!>Kw?&pS$Xes3B}?wf?9 zt7i_*L0`A6oc5x9UEcocW4@j}^}s$um8F_bLCpn@z^Q*DDSLb*rTadX^voKA5gjxQ zgzS37*LC5U8o~V(ad-D@ppqj${jasZ`Q``2OqnzGwfMOSxw+E+D4K&-!}q zV-k91oyHXd@(zHj4isD@g&{0BOosI*V8$J+O7sh?dpF%5Vu0`cX$t;4E8hbqUe4fq zzYT0Bq$d zeVcsU{WRCzlc~F!yZiuj*L8i6_EL>e^C}1(c!8Rtr(h%)gx1r9VOpR5Ag%RHq4k@8M)t+(W8L1neLbZliR|KdeR z?kTu;HeBYt`^bT@(qAh{WtaD`uXEdBWyg3f@qHEsvm9I^#aDj=Bo2(iybucOAO)r$ z_E}E8NC*r9Qcor6p;4iGeZQ}J8%BuaDHcJ`^?#Z5Gw(4JAL~NbDD7ohwC5=SKQsIT zB0BCp2%D92H6Z%WSxnbK=yE@y%qzg?+f#ZX6X{GA0{PuE@Koq0bq7);$aK+6ewP#i>XyIJuiuJH@z=J7sw|6h} zUdt(boPyP2hNuNeJy!vm;c45b7J9N6NHvXw8_&79$#-l!_yAgGJ1%erzrOZm1Bh(dVA0MEdnX5FPjKXKuZ|+q>Vl4+h*Z69df?HqX4u2>diPsMU=v*p4*EL#Exv1>yL~^z6FKY{Ma*5Vk!#PR7JH5* z$NLU1^{&&aa8r`+NN96qYofgkB-)>65M}8FN_w>4G3a=I9+IfytmoiH|)biY8PUEULjO#DkK#G&>TPG#v{dBE57l5gtD6R2y5 zv|IiR2l~2x+CLG@Fnn~Hk;I2n;=PB?O-M&vN`H+c*mKOiCol*DjBTotMML+McIrmP zHVu|i&9$Xin55eD--)Pm+aV<>n&~^Fu4mRV5XolxI%o!hSPo{mZST8eigqXH{7Chgu1!V(_{`CVrG!gp{sL0bvR>n?ki!{d5vl% zL-b=1@gDWZYF3Y*qf`!PZ?Z0H=)*t!3sFCOgjTw&4rtU~yJ32N)VT*%jzo zLgTvE%E!`g6tl`ixg5HarN4yL^kIlN3fh4m0*9zPjPdzT(+q+xT;PJnazOzuXpuqC zkI^*{cs&K*XM7JE#`PpKPLAsbG6JuQ1P|R(?@~+}Tk2d9nXe5{gUOa!2et4q>>q?A zSclwuT;@gN$Dps3u^sQ91oES#qrZ~e+@tlf$b0c9MPvU+ zaz*FG!6eOm-V-eEoo7C$YI%6IRMwYSwN61Es9{4M89F|jOe?9=;cd@j;4w3 z5kz0Vgy?}ZQCJY|zJzE;nrI0lN;GBK)08H-k`pY-Bv_gzP&vW4OoFLtf;Zt4c=qZ{ zf?`IHZky$xI!YT@{m(+6krrY1@t@FeaP%>pt`*8 zbZ&b`+3vVw+dB=v$F+8e;P}qg@?&bOpy3EMkTQE7k?zb zY`Nkvt{ABBdg@dqY(eAR{VqrbV6(#GFM|4aX>AbQ?S04n{bS(H1FE@8`!sN<%t}^t z{s@*)&_na`b0~*&vh@mKYgx+HTabfYY_$X02hy}3(eMM*J3w)7Ob6|8Z$BA*-1`Po z(6jyx=p0y1=A7s1eggU~@4KDb-c`2f=z7nyVN9ds2jHY`c$AHbAHz+UHFkU7?RpJ* z{)#Tu3F+s));}5kFpVR_Nb0sXFpgjVXBTuVs<8U(rb~qP;<-=5ZGcu@?Dm3)svU$7 z6rINv6D>8if5{)9PU*a8OFA*NI8UaW^Z1Tq^?@;UGNVe2fV}g*$xQBfpT&C-=zb;n zwR4tUl$`KQ_4b?W+72zBWY_9T?8=87DZ6%z?SJH*OYL$rb7FfT-Ws6o=Nw0)uX=&qV4~L?5QsAhXR8k`C9L(xKn^A=tdcvKBC2Z#0Z1g zRNO;#fE-_Uy`6~m`7F##gZ!!94^yTyk_+QW6>^1$5a(1j?vIN=&*`SaFDrRhq}Uf(L>MO?CV+iHW_(@jX&JdAJIMv8x1XNa(f=Wu+Vmn`-$~$@AbH!@V-6I znH+PjlE%wq0ixfM9LL)H+(a3ZW2l!>BT>7ai0$JRpU0AhBaP!1*0?vp873#!onviu zqAU4=sS@VF_BWvH^8UPY+s~CPPBuIa+|64N-T!$1F~~-pPobNhQj)oc(GG)%drZ1% z@5wz`X~yuYQlp>ht|{R$hh3|hGIm8?dD_?cELIL|#(##|%=-c#QV$Q%km~&{T!>No z=Z3-bIv9kmlFMv4XGLMgc#ZnDf!9>u8z38#AX8nBdrwizn5+B_5qsb0-1bJQ%3r1` z_pCpKv2ExJ$i9A~RqdBJfL}YN!?G^#TixED@LIkKu5>NmFw~OjpRVN<(EAKMX9tgO z&nQ9t-?*gykouBgLzOo9eBGr5<%&}M{=hTfPj9x$-?wPnvVR5`QBg)uzmKJU5d-q_ zaoGcxJ#g6r{|h`|5l_jqgqxLcd!Qv$MY&r$S_DM7TRTE&5ZR811X->rDrm#VZ4Gw_ zh;l7krO>Skp3M^g<*@0d;CZ-272ADdC+5wwyAGbcyX&pP-ESSab1|L-oVxh!C-s-Bh&Md;wgMfJ0Z?4Xs5KK|6+tLx5tEZ~vbk3uST{o{4&oW-; zoRw6#SyfixP?6Rp6-!|ffQ$1{?Na1-a<6l#oz zVjDxTO6X^rp^GebDz$j16U>RI9uGx=nO=b%@eVxa8Dd_pUA<;e-I68VRl?KUqXvJ@ z)K|frT0Bu1OnEBh&l$7--~DM&@Cp7*8Ii@G`lbMPTr*jkc3Tz)iNLwUPX=Q${j_TJ zI=y!F`c+G$pD0A@R@JT+@LUSU`dG9n6o(z5O*&dfwzy(w4|*_GZ;VAZq3P1)>+n>r zo(S9)is;RV1`#Pp13?74LL1)9;?rNr|3?LOt%0%56l94Na<8cCa?9bT7n6z?C;a3P19E|cdlj4JXepv>s95!%4wH` zYIz$A-%srN<#DG|@xkYzn4!hkBf&ap)TxsXQO2r|2aIW~8PfPfED(t|gR^1*_e(3D z)t*Zs!aJ~DkEW|wm27WBP^^n~R4kDV;&7mUGvAd5olZxZ14BYUkGEr(&;y8fP$4h^ z%^|%#90{}F5%vEtcnoKZnS5csL;L;J-H-*vesn$Z{BLonvA&f*$2UEi& zG{>Ut7?eVyJRLlU+;9RzRkE={BEzA0rPG1YFBak>o8BCVG;PtFLxDsR1Cc(TTTOL{ zhnj$@L^Zve12ozhJv66!PPJau8f_0%MdNLOM*S+#vF@;zM}B-R-g*<~?p2%)8ZSgi zC^(l!+_)Z&G_@tEL+RryE5~20FAHo8@N>K=7Vbz~tuJ0$cL}SZDteV(6-qSeRd^&` zr}u#9Rf+Zvy($@x=~cndM!hOdB_smlQ4Fn~*rKguM6hvvbCDf)bjfI<= z;c@bFOHJ~&%5YboEgd;U_wo zU%{T>mymc)KfVQ5!*(4{@3)bW;@G*na-n6E_1eb)V^db~y*@ZthQ;lPUknb`AU%b2 z15)1`gM%kgz8UFTNDm{m0e{DT4i0u8eH7{4NN4HRy`V++KC zJ@)~m(~!ooUsR8DD|X>Jkp2K^FVc0`Ej)yD40bF}B6VS_@jTKp?9|iyk>((sL|e=_ zuqDb4%holDWwXaJDnHlW3thCoNw@8F{AzIUDxz4D>mhg={_h6vI>KG=^4zI@wjgKa zi{Ros^*}#@a{OM*jtMy9I-^W_ZE$cWY*1XDT36XJcitxZPG!N!Yo^SYFrEm>4%*w; zc?vcXLL7vD82_7r?;w70lp%cz{|@*NTiFO0vSo2W4zgtDDg2K_*&d{+GWB+5rw-Ib z{O>?{9{EA?20E?QH&sSMGDgD>&A%BO{4oiYG}h;Gh=9uHp}g=c_F!zr@&z_oeiO>C z!G6X*6sP#rdsFgnNBMV9epg2M9jWsDC?AC#7kW2Hn*ZZe`BT8Fhy^x8OZzsmVrJhP zC?ALNuV%>qT#ElglsB!hiI9=0lFIpf4o#o*ry z!MIO{!O|`v{{LGd-*09XI8Eo68j;qEv_YgDBHby{UXdOU=^>FG6X{8jo)+nOkt*X9 zc6dapi*%YuYeZTv(gu-sh;*k&dqsLcq=!U$Or$48dRnCCMJiv`;~CHG&_y~;q%|U~ z7ioh?J4Cuuq`e~LQvUw4yeNR%ao>e)$a#}_8>?DJ$CkqUF!FtHs1rKVUIaoGhFUSVB2jQ4buC_|~s zwb(~v@XS?nzYEK9ZMpY@FxQ?-yY0D_oH49SBZ=1kKwh0RdM@%KY#J5V_W~9CFbt3(_1*qq^h^?gNhvSIU_BWhhYdJWIC~tj|cwZe(W?5fH-a4X$c4w>= zkZ&DX(!uZ$W;-*S+4&msT3hk2310yEoZQkMQ=T48$#oWe7x^N3!&<>8X!Y3b_Pqeq zKLD`1@~Ko&zX~?HyO4fkuqy?t0C^mF_Cu1+;SqG}!Q?0{{XL_DpTB@iu3h^X5(nA- zGB})MRIXxu8d99&O6j^k>Lc*w+7_Zgi7GKPWj{9L<+JQ zFfM;bQ8AJ2C;j;!Onjfnra^!H--P~O67Zp$@vASAfR9SRUhygzJAc)Ybtet;IR600)ouc zW9kY5ni=qdI-h*n>goi~3H7rit=;|%>^-Si9|xT~cSI4AasNU*6|Ul1sIa{TJ8Xnz zK}hzp<_7X*T=-R285LFHbmatW2G8;2+J6i{ z4dUc+Fas6U3sR4h0XB6S%=F|jz^)RbC!YcN>TD?W6fnS}-bjFp0VV3!pwQ!HK$#jN zX&wfQR)0!lg$&Tu+lj0spGGmn6X_{+7em7|rKk#tje@frt1-(5fUd$0hhiC>M@U6| z1{li~3_ut74?qrhmHEV}O#CNkv5c`2o5QL%5C=wuIXD$fx8zd?r~x(WwH7bsR^z1D zsFN2`iH*jg!ez*5e*vy&5@+flQsU#3mK=~ztFh8=GC}_;(L%{*P*l>)S)P{S6wO7F5*+9f#4s%Z6a ze@Wcp`4rfqM8H~sdb))qDcTQl8a`Rnod^~KZRti%vC$=R(s5W_*lI2K8WnO6Pl25! zTe;8|QbJj)GNF^H*OrwRoJ5(86i)dw5G8l1o_`~ivq|D!uF~d!ROTcfiiD@^cY=I) z8>{Q&O9?E5Q*6}b?X(~r-dDT?82Y!=u_D&-J`3yZc9=S1G4l_-70?o)(=WiJ*cwn? zNXV(}P*?1<7TigNVJf_OEQPIR(Fl5zMh_hF#mkoc>#_7HeHr>)RBr8iYDej9fJU9f z$=Y{l$FQ*Cpc1ujUH-3OK@P91+ILg_Mzmv&rHGd{V*Yx4X!OU8n(7<>Gettx6}Wi?#3W9XU?}+sV9X?fb%x zoMt$#vy_we?r?{d-A*>~>)W@(9m5MbcNcK*;0`yvm~(d#2M_Pap}E{1Hu72f4nPp> zy|a*vaaffA%5da3(FR?mY@XIvbAa+QFj4l ze~9pWY2l%~MoSCptHX)j{&hmo+QGJ_xQ__=JRT;|tlmz`iPB*-iPwrOrH>NopNYz5 zdlg=_*=^fU_2GPCPx4%4IV&K{!6x<&HnDdM(4gR86MKgTT$+PT>>X@kUnVE^BgDjB zqltaaXjVZNo7m?bp16~oMHBnnBO1x)6Z_mJoqMQ2@z9pEo9cESGKJ*R0(cl!+eeh# z21uh-lYL|f>CnE3lVeQLgCKRW3BF^joh{2~g6|mT{uT;AMiYF;jv|uiViSDF2NSOZ z1)JbI{wD083BKb)H{)j$e8)#6KLCquUfsk(DVnkG2D_&69fy$*8pp zmAt7V$Sb2gdS12Tm!#wgl;ll!kSIkhhp4<646v#Dsbppzskf_b1k7?0i-$Y)9I{uC z*@I&ht(h2STfYjNlcrVqm{yU^L#)2vrtw8c2+(H?4MYWKN6emp% zG)xYT0;nJY#>-5mMV>N-CI{~Ff@_f2smw`p6b*9};_#<9m|Vt@?}W7{HKILx4Ni1W zEhyQ41Pr-!jXgP%2M$x)`+U|ml>MyiH2BrNdL@51z{i;A z_i1L0<2+9w`bsoI?n^N4vC$M7*1p3#n5M_3a7~Zzuy%p{aiM8RL2HNdy;Ab0RP;nz z(R#?a+d);lS}6KaO3_2qjh( ztVy|twH4+T1x?Dm&W9M!XRKd>gnM0NH%4~FPBEN62waTW(Dx}6;Gkt99hUv{ge2Jz z8)dX1RxWJF!E3c=N(-zrVNfEUK(%j!brYau0aXpEnBtABFR6X4%Gkvyv^3|e5egTO zHXN4y>x9B)p|CXvm(}Jgc{>I1RSA?^YFSV$pUs)ruP2O|)*xhUtxA~rLLHmo#S9c6}09}f|Sw7S*imB(Ek(JW;aEtBx?@>05}reaM%iHgb$NNH zO}YxBS#{CmSFj8ujw!WFWd0m08iduK8bmj?P(dE8BF3fL2s<9kW1P}covl+a z*BFD`mJV_)-5S(SaxMwaTp3=hlaXKTsb1xff$vNim2x1tDldgjIh)Y=0?kdLo+WER zr3K6xMsr=}PUMzd5Wk6%)rGPr7G(?VVjj;W=?E{SFdHUn&*Bv`-J!z0Oosai8SW#^ zQ9cS{QqhP>8DdpS_m?YV#~YIhvy?j&Wo)L8xF>j1>y_wzT#ngE<1)F@9z>;R8&boZ zl&)A7i{)>w0!nB`fq!Ji=F+N#E)E;;e+T}*hX0@7|4sa>ma(dP6f)xYBT~MDp@Cf` z(CR|YHj++P(rG50YH_mAFA$a+ank%a<+S2ti_&Q$opuq9=&W~9j-J`i*-xi`p%cx^ za~_vD>r=>KheC0va)D;8uxOfn{u!G^=hN- z8#GIwRy$4g6=~WzZKQnx7;n(lsgs6jT0*_PRI^xTsGqiI1=iIYw5p_5@ENtPL@T^e z^C&8oXOC!wR>uad;H;j_GV49I^MEBt>xK^HM{*u&5^{( zb0c()&^*9t_Sdz1`+J(UODnEIu1K2%HR>{LEF}OJAhj;jMiDru6(g~1(6p~<4iZR^ z{em_mBa!{?Mo@s?e=%MC$*cjl9VGJ(Ht$@5yG?f z_W%}>etXhBU!6J}UVDqEN55u&NXrGn0-M||+OV^lbC+=MGG+^869W=*38`3%)V51o%9F)N zG+>8y5@!>j9DAKMyHlI8OS=k?N@dHbtQL@!%9dv@^R3X_upP}&{E+4lmcYd~oY6`j z)bfFNUDn^xXa5T!c|10w8O~^99?#R2XH=1X;W|^(#V(9uUX8AO-?WQql zsF5v)Mm8GNXmooM|1_%Ifqyotd1%K*VJ8~PEHsv>G$>hVD6-PvrPA=E(uS={!%ZTJDL6bxiZSweGIUCXpQG*hpZ)1qk) zXu~kN?b343XeBuRMJr5b`A=$=8)l=oB(=gmZP>S{#L~G0)<2n9_xt|`b+;eUTxYfX z-DGZlmF8sjC%7BtX?ZQ0>xh<*h*+jsmlJ`bMRT@j1)Et%RISNgId)mCjuTqm1T8-a zE3L)$4T!_C0YlVkZV|(X)}*E-wNc;FrnYKYTq~VNRUKu&Q5!+(5w0r*9~uu@A#pzX z`UZ5}VP~|m%?6>eTd*FWZ6=xHTQr@-+^>zBuZ^0=W!_JMcn>0(n|Pjj02hx}4_GXI zf3&&TkIy}|(#@cB69auhiGPL3U$+_`F$x6z9SM9>3b&Es?$kuPzcreSDe}%w{`n>G z%_u*U(wJ-(pKNNzmzVG@q}6_){EdM)`(RbL1^1%{+d?sDUAubma{sE;s}`+5hGcJz zM)1|9DDLcKrzCDSZ;9aEWil)r@dtuIVgq3~(i~Ojer-Qie0coB@KLNZJ8|Luc>mT= zEUMspQ`k3;((Q2i;^{NQJt%rbdm3V{l95fgEw&;--+PLq5D#=T-B!^Ni_(4b(O3nlPSubFO>KdA zt1PB_Yb%EV$H%bZaeP+`j*`A7Vn1%m_BTb_lI;=h_qFTRco(i@G)>W9sA(gdCBDSv zkG2IVFz^vFI5#X*`;&0!jOn}q@P#oYnB>p8Fd1;%ZLong>6#@gsgbsX@Q6`da5u+7 zxOqHIv4D?n(RaYma`MAq>6_Kb`Xufkk4A!VQ3H14J_|zJAB_)>u~5wj4QgbH4Hg;k zU>sHl+M1GW_|})7J}Bl7;udZC4jBD%B0oZgxQqujhIn9Rd;*O=BX*lYjJQ!+!6(=# z;a?OZP0fM!aGU&48pR)~io5j{e=-8ggEN%GMn4|QX;PY#ZEZ}yXdim^f%%2Lvxa(Z ziPJ69{y0T!MqOEZb;Lp&d8eahWFgL5w6<=ASA3=o%Ec$v{H%3m&m=kRXigURbceSR z$EVh~#juOa!l&7&saT+}JHGw&^b!nW{U{uS2=+O*l#5{n+A;MNH9WEf68<4M9&*#g zhvdj*@eWe4k#!6iL#RJ_o_%G%iW7(c6qpN1XCg)vQN+9tmkSWpv+)au#f3-gEJ#MkTCxW~OEM>#$~$*5pWz(NfH z(sWz0gW{GNnwcWM(&y*lWpFZdqC>V&Z{*=How&%}K&)jW?;eX+toCm3E@o}W!j@Hg z$169mF48cR@PTV%uz#4pQGSW2Udj74AR3l$Yc8y@+gCg2!;dWSO2I4q0a^3 zql2g)eV~wip0K$s8lZOPf^`|hOd6|2+E7ET5#1b-#K#5}SR}nIjEh#BvC__Gdtft# zailHO426E=@ibzpwls7%n!c6T>Ss2Qy@(O^#13ol2#w)NFq)*V1v1STW>Imj8NV=d z+DbeV!XA}rYK>Mcu3B6X+T2lrF}#gGn^ncB2s?v4ErOS+(UUQuDqO$(vuBDA+qOiK zc(MfFkfaAn=<$-OmZqjlNvdZ__Wwo}#;yN`g0xjp1DgmVAw2VmYYH<&*s3tP%2pc4 z&}J3Xbt4=MhMJK{jY`O~!92lAW637OARnVM5i|l3hK+3^LtaNV%p|jcB+WzPX&Oqj zvwScd>xQ;@9Tmlbz;YOS1WsZCv3C zu%lOS`Ns25@;?;v&(r;gIOx_JI;?P@1y3EA@59e$jxAK=_qI7THuM;MnIfNOkoZ}^ z7r}n>Z4BAI>r6XnL~s60u!G^H)O6aD1^*2p$NZbv_p;Ex1iYRWo66DMTRJ^W(vU*2 z%o!%frI>HN8DRKKT7v$X1z(88z4W<}Yf2V8J<~H3{c47HrEVp!5W;Q--UItjHW;Pj znJ=PO-KpngWa+J0{ymEv+7uaz{@pD2f-LgK z0`H+)QBBA6Ec8pV;BU-=zm4P%5kK^u_@V6Y&Vs)`3;z3A@ULXSpJ8~HV*Z)*yujCs z@%B35k3rxI)e(xlA=5#0mjLxs^Q~CL44+9$P&x30@Ptys%K)-trjTR){d`dtIqQM< zV4Od>QwR{rjY3YZuwN7Se-QQ31)hHYpo8v;A~~lU7??V37joqO);>|PSK!~A#u4(i z!5)TBv8OTzvf#gy1^;3eJl$3`RGgdx9(S@R71yRzvJBmmITStJcU`2q6px@U5Nx9e zpDBVtm09phv*0%{yh}0P640E5o^BT%O7GSz_w_C8{g2%i|9;hW&{^3+({l;pNI{ z3QFP$Y>;3Umi}C~AB!?fEF+kq`u)MEzojkOh^0&rTQ}ISNN%Qy8lGIodl(>LNDBIX zId(?yaQGHKX6~^qN^=a)+53aZ_I6s`8z8Jj!ifx0;|w259BkfHPEYUhR92^UUC4ep zhfJ-n{Qg=j6}^7ELc#CHTAi({{Y!3GwQyzKVyMOzm*49XM7||!6#vo{s~0U?;a^=_ zyVkqTzi#286<+_4dnBpdzZ&^jbo$o$C2ONgzVx0V$5+zLYwlDTiISCwG|C-?jN(uF zsyf|x+mTGfGZ@nAMpZ%Cwyj66f#UnVte!)0Kw zw?o^3*fYHidoSU(RN+j%QIdjF&NVLo;$n9pgNiNqGcd+2tBeA+Gn0Wqi)_YA8Tg(I zU+BX@@lYmFdsAB|5J`4qU}>S6fk0=##sO83_LkWGZ$>%o*ap%yrW*ROBNbr`CgG?8 zt=k*7&?-4Yir5&;z)|Rk6}%riN6`p30$l($#iL^TM{d8ghuWJuwxk49BQ9xghZdQ% zuY~ujKpfSM?^5uUe~O%$&GvwTZJ?rVfxSf30dMW`cZ6xTtT7%JUXYR^*df4PO?wkw zU6aTVMH`nH2)W~xfrQEJ(T$mopstregfR)vz3>g6i~@7e(Uu|hE%{EpiLz;Pz|Y5x zi~`#B%RtDQ@x2YPJ)A)yc4jhge*e0ai^b@~I&>`5LOZ@OplQrqN1Nu@4a8Oty%L3n zU@`~;Dt279X4apLowPTA1$KrKzR=DXokunck zu+0l?Tt326q1TYK(|%fIFw~fA0VTZ(1b7azA5mmcVgtFiX91{vl=7AcH&3Qu^il2xM9>7%^R8c1nKS(ZmiP&ZJW6w+jN9zG*Vp1S<95 zrFR8Le))a?ncl>-(B1|=B%Mre2AbYIAYu9b0hu-kKC}G-t+XLSvL(NKAA(Hf`w*ml zbNx38{zXDygP0i0RKAaa_{nEx{++;)PjF)(KlIGha8D5{kah?vn47=A1hN`GK$n}{~6$2 z_!q-YYTt9Ou*0lR!ZQ6cc-;nmxzF1Bck+J(UWz@bU+y>V6a44Nxj3l*(;@ZBIHKFU ziA3_t{l~qlh#JpZ3w{oz`K6p3lpFb#20>ZR)02`>q`C>F{ZNu6^`CCw1SbXmd9fcX z*>sr^X`#?R&4icySDEl+D;+YW`w?ZHm+ // 提供网络地址转换函数 +#include // 定义错误码 +#include // 文件操作相关函数 +#include // 定义网络协议的结构体和函数 +#include // 提供信号处理函数 +#include // 标准输入输出 +#include // 标准库函数,如exit() +#include // 字符串操作函数 +#include // 套接字相关函数 +#include // 提供 gettimeofday 函数 +#include // 定义数据类型 +#include // 时间相关函数 +#include // 提供POSIX API,如read()、write() + +#define VERSION 23 // 服务器版本号 +#define BUFSIZE 8096 // 缓冲区大小 +#define ERROR 42 // 错误日志类型 +#define LOG 44 // 普通日志类型 +#define FORBIDDEN 403 // HTTP状态码:禁止访问 +#define NOTFOUND 404 // HTTP状态码:未找到资源 + +#ifndef SIGCLD +#define SIGCLD SIGCHLD // 为兼容不同系统定义信号别名 +#endif + +// 支持的文件扩展名及其对应的MIME类型 +struct { + char *ext; // 文件扩展名 + char *filetype; // MIME类型 +} extensions[] = { + {"gif", "image/gif"}, + {"jpg", "image/jpg"}, + {"jpeg", "image/jpeg"}, + {"png", "image/png"}, + {"ico", "image/ico"}, + {"zip", "image/zip"}, + {"gz", "image/gz"}, + {"tar", "image/tar"}, + {"htm", "text/html"}, + {"html", "text/html"}, + {0, 0} // 结束标志 +}; + +/* Ctrl+C信号处理函数 */ +void ctrlc_handler(int sig) +{ + printf("您按下了Ctrl+C终止了Web服务器\n"); + exit(0); +} + +// 计算两个时间点之间的时间差(以毫秒为单位) +long calculate_time_diff(struct timespec start, struct timespec end) { + long diff_sec = end.tv_sec - start.tv_sec; // 秒部分差值 + long diff_nsec = end.tv_nsec - start.tv_nsec; // 纳秒部分差值 + return diff_sec * 1000 + diff_nsec / 1000000.0; // 转换为毫秒 +} + +void logger(int type, const char *s1, const char *s2, int socket_fd) { + int fd; + char logbuffer[BUFSIZE * 2]; + char timebuffer[64]; // 用于存储格式化时间字符串 + + // 获取当前时间(秒和微秒) + struct timeval tv; + gettimeofday(&tv, NULL); + + // 将秒部分格式化为字符串(年月日 时分秒) + struct tm *tm_info = localtime(&tv.tv_sec); + strftime(timebuffer, sizeof(timebuffer), "%Y-%m-%d %H:%M:%S", tm_info); + + // 添加毫秒部分到时间字符串 + char full_timebuffer[256]; + snprintf(full_timebuffer, sizeof(full_timebuffer), "[%s.%03ld]", timebuffer, tv.tv_usec / 1000); + + // 根据日志类型生成日志内容 + switch (type) { + case ERROR: // 错误日志 + snprintf(logbuffer, sizeof(logbuffer), "%s [ERROR] %s:%s Errno=%d exiting pid=%d", + full_timebuffer, s1, s2, errno, getpid()); + break; + case FORBIDDEN: // 403 禁止访问 + if (write(socket_fd, + "HTTP/1.1 403 Forbidden\nContent-Length: 185\nConnection: " + "close\nContent-Type: text/html\n\n" + "\n403 " + "Forbidden\n\n

Forbidden

\n" + "The requested URL, file type or operation is not allowed on this simple " + "static file webserver.\n" + "\n", + 271) < 0) { + perror("Failed to send 403 Forbidden response"); + } + snprintf(logbuffer, sizeof(logbuffer), "%s [FORBIDDEN] %s:%s", full_timebuffer, s1, s2); + break; + case NOTFOUND: // 404 未找到 + if (write(socket_fd, + "HTTP/1.1 404 Not Found\nContent-Length: 136\nConnection: " + "close\nContent-Type: text/html\n\n" + "\n404 Not Found\n\n

Not " + "Found

\n" + "The requested URL was not found on this server.\n\n", + 224) < 0) { + perror("Failed to send 404 Not Found response"); + } + snprintf(logbuffer, sizeof(logbuffer), "%s [NOT FOUND] %s:%s", full_timebuffer, s1, s2); + break; + case LOG: // 普通日志 + snprintf(logbuffer, sizeof(logbuffer), "%s [INFO] %s:%s:%d", full_timebuffer, s1, s2, + socket_fd); + break; + } + + // 打开日志文件并写入日志内容 + #ifdef DEBUG + if ((fd = open("webserver.log", O_CREAT | O_WRONLY | O_APPEND, 0644)) >= 0) { + if (write(fd, logbuffer, strlen(logbuffer)) < 0) { + perror("Failed to write log to file"); + } + if (write(fd, "\n", 1) < 0) { + perror("Failed to write newline to log file"); + } + close(fd); + } else { + perror("Failed to open log file"); + } + #endif +} + +// 处理HTTP请求的函数 +void web(int fd, int hit) { + int j, file_fd, buflen; + long i, ret, len; + char *fstr; + static char buffer[BUFSIZE + 1]; // 静态缓冲区,自动初始化为0 + + // 定义计时变量 + struct timespec start, end; + long duration; + logger(LOG, "Process new web request", "", fd); + + // 记录开始时间(读取请求) + clock_gettime(CLOCK_MONOTONIC, &start); + ret = read(fd, buffer, BUFSIZE); // 读取客户端请求 + if (ret <= 0) { // 读取失败 + logger(FORBIDDEN, "Failed to read browser request", "", fd); + return; + } + buffer[ret]='\0'; + + #ifdef DEBUG + printf("第%d个客户请求:%s\n",hit,buffer); + #endif + + // 记录结束时间并计算耗时 + clock_gettime(CLOCK_MONOTONIC, &end); + duration = calculate_time_diff(start, end); + logger(LOG, "Time taken for request reading", "", duration); + + // 清除换行符和回车符 + for (i = 0; i < ret; i++) { + if (buffer[i] == '\r' || buffer[i] == '\n') buffer[i] = '*'; + } + + // 记录开始时间(解析请求) + clock_gettime(CLOCK_MONOTONIC, &start); + if (strncmp(buffer, "GET ", 4)) { // 检查是否为GET请求 + logger(FORBIDDEN, "Only simple GET operation supported", buffer, fd); + return; + } + logger(LOG, "request", buffer, hit); + + for (i = 4; i < BUFSIZE; i++) { // 截取文件路径 + if (buffer[i] == ' ') { + buffer[i] = 0; + break; + } + } + clock_gettime(CLOCK_MONOTONIC, &end); + duration = calculate_time_diff(start, end); + logger(LOG, "Time taken for request parsing", "", duration); + + // 检查路径是否合法 + for (j = 0; j < i - 1; j++) { + if (buffer[j] == '.' && buffer[j + 1] == '.') { + logger(FORBIDDEN, "Parent directory (..) path names not supported", buffer, fd); + return; + } + } + + // 默认返回 index.html + if (!strncmp(&buffer[0], "GET /\0", 6)) strcpy(buffer, "GET /index.html"); + + // 文件类型解析 + buflen = strlen(buffer); + fstr = 0; + clock_gettime(CLOCK_MONOTONIC, &start); + for (i = 0; extensions[i].ext != 0; i++) { + len = strlen(extensions[i].ext); + if (!strncmp(&buffer[buflen - len], extensions[i].ext, len)) { + fstr = extensions[i].filetype; + break; + } + } + clock_gettime(CLOCK_MONOTONIC, &end); + duration = calculate_time_diff(start, end); + logger(LOG, "Time taken for file type detection", "", duration); + + if (fstr == 0) { + logger(FORBIDDEN, "File extension type not supported", buffer, fd); + return; + } + + // 文件打开 + clock_gettime(CLOCK_MONOTONIC, &start); + if ((file_fd = open(&buffer[5], O_RDONLY)) == -1) { + logger(NOTFOUND, "Failed to open file", &buffer[5], fd); + return; + } + clock_gettime(CLOCK_MONOTONIC, &end); + duration = calculate_time_diff(start, end); + logger(LOG, "Time taken for file opening", "", duration); + + // 文件读取与传输 + logger(LOG, "SEND", &buffer[5], hit); + clock_gettime(CLOCK_MONOTONIC, &start); + len = (long)lseek(file_fd, 0, SEEK_END); + lseek(file_fd, 0, SEEK_SET); + sprintf(buffer, + "HTTP/1.1 200 OK\nServer: nweb/%d.0\nContent-Length: %ld\nConnection: " + "close\nContent-Type: %s\n\n", + VERSION, len, fstr); + + logger(LOG, "Header", buffer, hit); + if (write(fd, buffer, strlen(buffer)) < 0) { + logger(ERROR, "Failed to write HTTP header", "", fd); + close(file_fd); + return; + } + + // 分块读取文件内容并发送 + while ((ret = read(file_fd, buffer, BUFSIZE)) > 0) { + if (write(fd, buffer, ret) < 0) { + logger(ERROR, "Failed to write file content", "", fd); + break; + } + } + clock_gettime(CLOCK_MONOTONIC, &end); + duration = calculate_time_diff(start, end); + logger(LOG, "Time taken for file transfer", "", duration); + + #ifdef DEBUG + printf("第%d个客户服务器完成\n",hit); + #endif + + // 关闭文件和套接字 + close(file_fd); + close(fd); +} + +// 主函数,设置服务器并监听客户端连接 +int main(int argc, char **argv) { + int i, port, listenfd, socketfd, hit; + socklen_t length; + static struct sockaddr_in cli_addr; // 客户端地址 + static struct sockaddr_in serv_addr; // 服务器地址 + + // 检查命令行参数是否正确 + if (argc < 3 || argc > 3 || !strcmp(argv[1], "-?")) { + (void)printf( + "hint: webserver Port-Number Top-Directory\t\tversion %d\n\n" + "\twebserver is a small and very safe mini web server\n" + "\twebserver only servers out file/web pages with extensions named below\n" + "\t and only from the named directory or its sub-directories.\n" + "\tThere is no fancy features = safe and secure.\n\n" + "\tExample: webserver 8181 /home/oslab &\n\n" + "\tOnly Supports:", + VERSION); + for (i = 0; extensions[i].ext != 0; i++) (void)printf(" %s", extensions[i].ext); + + (void)printf( + "\n\tNot Supported: URLs including \"..\", Java, Javascript, CGI\n" + "\tNot Supported: directories / /etc /bin /lib /tmp /usr /dev /sbin \n" + "\tNo warranty given or implied\n\tNigel Griffiths nag@uk.ibm.com\n"); + exit(0); + } + + /* 设置Ctrl+C信号处理 */ + if(signal(SIGINT,ctrlc_handler)==SIG_ERR) + (void)printf("错误: 无法设置SIGINT信号处理\n"); + + if (!strncmp(argv[2], "/", 2) || !strncmp(argv[2], "/etc", 5) || !strncmp(argv[2], "/bin", 5) || + !strncmp(argv[2], "/lib", 5) || !strncmp(argv[2], "/tmp", 5) || + !strncmp(argv[2], "/usr", 5) || !strncmp(argv[2], "/dev", 5) || + !strncmp(argv[2], "/sbin", 6)) { + (void)printf("ERROR: Bad top directory %s, see nweb -?\n", argv[2]); + exit(3); + } + + // 验证并切换到指定目录 + if (chdir(argv[2]) == -1) { + perror("Failed to change directory"); + exit(4); + } + + port = atoi(argv[1]); + if (port < 1 || port > 60000) { + fprintf(stderr, "Invalid port number: %d\n", port); + exit(1); + } + // 设置服务器监听套接字 + if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + perror("Socket creation failed"); + exit(1); + } serv_addr.sin_family = AF_INET; + + /* Eliminates "Address already in use" error from bind. */ + int optval=1; + if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, + (const void *)&optval , sizeof(int)) < 0) + return -1; + + serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); + serv_addr.sin_port = htons(port); + if (bind(listenfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { + perror("Bind failed"); + exit(1); + } + if (listen(listenfd, 64) < 0) { + perror("Listen failed"); + exit(1); + } + + // 接受客户端连接 + for (hit = 1;; hit++) { + length = sizeof(cli_addr); + if ((socketfd = accept(listenfd, (struct sockaddr *)&cli_addr, &length)) < 0) { + logger(ERROR, "system call", "accept", 0); + } + web(socketfd, hit); + } + logger(LOG, "webserver exit noramlly", "", 0); + return 0; +} diff --git a/server-exp3/webserver.log b/server-exp3/webserver.log new file mode 100644 index 0000000..e37eebc --- /dev/null +++ b/server-exp3/webserver.log @@ -0,0 +1,92 @@ +[2025-04-21 16:17:13.181] [INFO] Process new web request::4 +[2025-04-21 16:17:19.416] [FORBIDDEN] Failed to read browser request: +[2025-04-21 16:17:22.472] [INFO] Process new web request::5 +[2025-04-21 16:17:22.475] [INFO] Time taken for request reading::2 +[2025-04-21 16:17:22.475] [INFO] request:GET /index.html HTTP/1.1**Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8**Upgrade-Insecure-Requests: 1**User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/60.5 Safari/605.1.15**Accept-Encoding: gzip, deflate**Accept-Language: zh-CN,zh;q=0.90**Connection: Keep-Alive**Host: 127.0.0.1:8088**Sec-Fetch-Dest: document**Sec-Fetch-Mode: navigate**Sec-Fetch-Site: none****:2 +[2025-04-21 16:17:22.475] [INFO] Time taken for request parsing::0 +[2025-04-21 16:17:22.475] [INFO] Time taken for file type detection::0 +[2025-04-21 16:17:22.475] [INFO] Time taken for file opening::0 +[2025-04-21 16:17:22.475] [INFO] SEND:index.html:2 +[2025-04-21 16:17:22.475] [INFO] Header:HTTP/1.1 200 OK +Server: nweb/23.0 +Content-Length: 275 +Connection: close +Content-Type: text/html + +:2 +[2025-04-21 16:17:22.489] [INFO] Time taken for file transfer::14 +[2025-04-21 16:17:23.071] [INFO] Process new web request::5 +[2025-04-21 16:17:23.071] [INFO] Time taken for request reading::0 +[2025-04-21 16:17:23.071] [INFO] request:GET /example.jpg HTTP/1.1**Accept: image/webp,video/*;q=0.8,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5**Referer: http://127.0.0.1:8088/index.html**User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/60.5 Safari/605.1.15**Accept-Encoding: gzip, deflate**Accept-Language: zh-CN,zh;q=0.90**Connection: Keep-Alive**Host: 127.0.0.1:8088**Sec-Fetch-Dest: image**Sec-Fetch-Mode: no-cors**Sec-Fetch-Site: same-origin****:3 +[2025-04-21 16:17:23.071] [INFO] Time taken for request parsing::0 +[2025-04-21 16:17:23.071] [INFO] Time taken for file type detection::0 +[2025-04-21 16:17:23.071] [INFO] Time taken for file opening::0 +[2025-04-21 16:17:23.071] [INFO] SEND:example.jpg:3 +[2025-04-21 16:17:23.071] [INFO] Header:HTTP/1.1 200 OK +Server: nweb/23.0 +Content-Length: 193852 +Connection: close +Content-Type: image/jpg + +:3 +[2025-04-21 16:17:23.334] [INFO] Time taken for file transfer::262 +[2025-04-21 16:18:42.699] [INFO] Process new web request::5 +[2025-04-21 16:18:42.699] [INFO] Time taken for request reading::0 +[2025-04-21 16:18:42.699] [INFO] request:GET /index.html HTTP/1.0 ****P;aqoգ !}s 'D+DxS^h_q#ny~:4 +[2025-04-21 16:18:42.699] [INFO] Time taken for request parsing::0 +[2025-04-21 16:18:42.699] [INFO] Time taken for file type detection::0 +[2025-04-21 16:18:42.699] [INFO] Time taken for file opening::0 +[2025-04-21 16:18:42.699] [INFO] SEND:index.html:4 +[2025-04-21 16:18:42.699] [INFO] Header:HTTP/1.1 200 OK +Server: nweb/23.0 +Content-Length: 275 +Connection: close +Content-Type: text/html + +:4 +[2025-04-21 16:18:42.699] [INFO] Time taken for file transfer::0 +[2026-06-16 16:27:48.793] [INFO] Process new web request::4 +[2026-06-16 16:27:48.793] [INFO] Time taken for request reading::0 +[2026-06-16 16:27:48.793] [INFO] request:GET /index.html HTTP/1.0 ****:1 +[2026-06-16 16:27:48.793] [INFO] Time taken for request parsing::0 +[2026-06-16 16:27:48.793] [INFO] Time taken for file type detection::0 +[2026-06-16 16:27:48.793] [INFO] Time taken for file opening::0 +[2026-06-16 16:27:48.794] [INFO] SEND:index.html:1 +[2026-06-16 16:27:48.794] [INFO] Header:HTTP/1.1 200 OK +Server: nweb/23.0 +Content-Length: 275 +Connection: close +Content-Type: text/html + +:1 +[2026-06-16 16:27:48.794] [INFO] Time taken for file transfer::0 +[2026-06-16 16:47:59.043] [INFO] Process new web request::4 +[2026-06-16 16:47:59.044] [INFO] Time taken for request reading::0 +[2026-06-16 16:47:59.044] [INFO] request:GET /index.html HTTP/1.0 ****:1 +[2026-06-16 16:47:59.044] [INFO] Time taken for request parsing::0 +[2026-06-16 16:47:59.044] [INFO] Time taken for file type detection::0 +[2026-06-16 16:47:59.044] [INFO] Time taken for file opening::0 +[2026-06-16 16:47:59.044] [INFO] SEND:index.html:1 +[2026-06-16 16:47:59.044] [INFO] Header:HTTP/1.1 200 OK +Server: nweb/23.0 +Content-Length: 275 +Connection: close +Content-Type: text/html + +:1 +[2026-06-16 16:47:59.045] [INFO] Time taken for file transfer::0 +[2026-06-16 17:12:17.415] [INFO] Process new web request::5 +[2026-06-16 17:12:17.415] [INFO] Time taken for request reading::0 +[2026-06-16 17:12:17.416] [INFO] request:GET /index.html HTTP/1.1**Host: 127.0.0.1:8088**User-Agent: curl/8.18.0**Accept: */*****:2 +[2026-06-16 17:12:17.416] [INFO] Time taken for request parsing::0 +[2026-06-16 17:12:17.416] [INFO] Time taken for file type detection::0 +[2026-06-16 17:12:17.416] [INFO] Time taken for file opening::0 +[2026-06-16 17:12:17.416] [INFO] SEND:index.html:2 +[2026-06-16 17:12:17.416] [INFO] Header:HTTP/1.1 200 OK +Server: nweb/23.0 +Content-Length: 275 +Connection: close +Content-Type: text/html + +:2 +[2026-06-16 17:12:17.416] [INFO] Time taken for file transfer::0 diff --git a/server-exp3/webserver_pool b/server-exp3/webserver_pool new file mode 100755 index 0000000000000000000000000000000000000000..cb4ee7e98215ff86af4d1e077731d1a5cdb18a5e GIT binary patch literal 58760 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 literal 0 HcmV?d00001 diff --git a/server-exp3/webserver_pool.c b/server-exp3/webserver_pool.c new file mode 100644 index 0000000..b5bdb96 --- /dev/null +++ b/server-exp3/webserver_pool.c @@ -0,0 +1,374 @@ +#include // 提供网络地址转换函数 +#include // 定义错误码 +#include // 文件操作相关函数 +#include // 定义网络协议的结构体和函数 +#include // 提供信号处理函数 +#include // 标准输入输出 +#include // 标准库函数,如exit() +#include // 字符串操作函数 +#include // 套接字相关函数 +#include // 提供 gettimeofday 函数 +#include // 定义数据类型 +#include // 时间相关函数 +#include // 提供POSIX API,如read()、write() +#include "thpool.h" + + +#define VERSION 23 // 服务器版本号 +#define BUFSIZE 8096 // 缓冲区大小 +#define ERROR 42 // 错误日志类型 +#define LOG 44 // 普通日志类型 +#define FORBIDDEN 403 // HTTP状态码:禁止访问 +#define NOTFOUND 404 // HTTP状态码:未找到资源 +#define NTHREADS 4 +#define SBUFSIZE 16 + +#ifndef SIGCLD +#define SIGCLD SIGCHLD // 为兼容不同系统定义信号别名 +#endif + +// 支持的文件扩展名及其对应的MIME类型 +struct { + char *ext; // 文件扩展名 + char *filetype; // MIME类型 +} extensions[] = { + {"gif", "image/gif"}, + {"jpg", "image/jpg"}, + {"jpeg", "image/jpeg"}, + {"png", "image/png"}, + {"ico", "image/ico"}, + {"zip", "image/zip"}, + {"gz", "image/gz"}, + {"tar", "image/tar"}, + {"htm", "text/html"}, + {"html", "text/html"}, + {0, 0} // 结束标志 +}; + +typedef struct _param { + int hit; + int socketfd; +} param; + +/* Ctrl+C信号处理函数 */ +void ctrlc_handler(int sig) +{ + printf("您按下了Ctrl+C终止了Web服务器\n"); + exit(0); +} + +// 计算两个时间点之间的时间差(以毫秒为单位) +long calculate_time_diff(struct timespec start, struct timespec end) { + long diff_sec = end.tv_sec - start.tv_sec; // 秒部分差值 + long diff_nsec = end.tv_nsec - start.tv_nsec; // 纳秒部分差值 + return diff_sec * 1000 + diff_nsec / 1000000.0; // 转换为毫秒 +} + +void logger(int type, const char *s1, const char *s2, int socket_fd) { + int fd; + char logbuffer[BUFSIZE * 2]; + char timebuffer[64]; // 用于存储格式化时间字符串 + + // 获取当前时间(秒和微秒) + struct timeval tv; + gettimeofday(&tv, NULL); + + // 将秒部分格式化为字符串(年月日 时分秒) + struct tm *tm_info = localtime(&tv.tv_sec); + strftime(timebuffer, sizeof(timebuffer), "%Y-%m-%d %H:%M:%S", tm_info); + + // 添加毫秒部分到时间字符串 + char full_timebuffer[256]; + snprintf(full_timebuffer, sizeof(full_timebuffer), "[%s.%03ld]", timebuffer, tv.tv_usec / 1000); + + // 根据日志类型生成日志内容 + switch (type) { + case ERROR: // 错误日志 + snprintf(logbuffer, sizeof(logbuffer), "%s [ERROR] %s:%s Errno=%d exiting pid=%d", + full_timebuffer, s1, s2, errno, getpid()); + break; + case FORBIDDEN: // 403 禁止访问 + if (write(socket_fd, + "HTTP/1.1 403 Forbidden\nContent-Length: 185\nConnection: " + "close\nContent-Type: text/html\n\n" + "\n403 " + "Forbidden\n\n

Forbidden

\n" + "The requested URL, file type or operation is not allowed on this simple " + "static file webserver.\n" + "\n", + 271) < 0) { + perror("Failed to send 403 Forbidden response"); + } + snprintf(logbuffer, sizeof(logbuffer), "%s [FORBIDDEN] %s:%s", full_timebuffer, s1, s2); + break; + case NOTFOUND: // 404 未找到 + if (write(socket_fd, + "HTTP/1.1 404 Not Found\nContent-Length: 136\nConnection: " + "close\nContent-Type: text/html\n\n" + "\n404 Not Found\n\n

Not " + "Found

\n" + "The requested URL was not found on this server.\n\n", + 224) < 0) { + perror("Failed to send 404 Not Found response"); + } + snprintf(logbuffer, sizeof(logbuffer), "%s [NOT FOUND] %s:%s", full_timebuffer, s1, s2); + break; + case LOG: // 普通日志 + snprintf(logbuffer, sizeof(logbuffer), "%s [INFO] %s:%s:%d", full_timebuffer, s1, s2, + socket_fd); + break; + } + + // 打开日志文件并写入日志内容 + #ifdef DEBUG + if ((fd = open("webserver.log", O_CREAT | O_WRONLY | O_APPEND, 0644)) >= 0) { + if (write(fd, logbuffer, strlen(logbuffer)) < 0) { + perror("Failed to write log to file"); + } + if (write(fd, "\n", 1) < 0) { + perror("Failed to write newline to log file"); + } + close(fd); + } else { + perror("Failed to open log file"); + } + #endif +} + +// 处理HTTP请求的函数 +void web(void *arg) { + int j, file_fd, buflen; + long i, ret, len; + char *fstr; + char buffer[BUFSIZE + 1]; // 改为线程局部栈缓冲区,避免多线程共享同一缓冲区造成竞争 + param* datap=(param *) arg; + int fd = datap->socketfd; + int hit = datap->hit; + + // 定义计时变量 + struct timespec start, end; + long duration; + logger(LOG, "Process new web request", "", fd); + + // 记录开始时间(读取请求) + clock_gettime(CLOCK_MONOTONIC, &start); + ret = read(fd, buffer, BUFSIZE); // 读取客户端请求 + if (ret <= 0) { // 读取失败 + logger(FORBIDDEN, "Failed to read browser request", "", fd); + return; + } + buffer[ret]='\0'; + + #ifdef DEBUG + printf("第%d个客户请求:%s\n",hit,buffer); + #endif + + // 记录结束时间并计算耗时 + clock_gettime(CLOCK_MONOTONIC, &end); + duration = calculate_time_diff(start, end); + logger(LOG, "Time taken for request reading", "", duration); + + // 清除换行符和回车符 + for (i = 0; i < ret; i++) { + if (buffer[i] == '\r' || buffer[i] == '\n') buffer[i] = '*'; + } + + // 记录开始时间(解析请求) + clock_gettime(CLOCK_MONOTONIC, &start); + if (strncmp(buffer, "GET ", 4)) { // 检查是否为GET请求 + logger(FORBIDDEN, "Only simple GET operation supported", buffer, fd); + return; + } + logger(LOG, "request", buffer, hit); + + for (i = 4; i < BUFSIZE; i++) { // 截取文件路径 + if (buffer[i] == ' ') { + buffer[i] = 0; + break; + } + } + clock_gettime(CLOCK_MONOTONIC, &end); + duration = calculate_time_diff(start, end); + logger(LOG, "Time taken for request parsing", "", duration); + + // 检查路径是否合法 + for (j = 0; j < i - 1; j++) { + if (buffer[j] == '.' && buffer[j + 1] == '.') { + logger(FORBIDDEN, "Parent directory (..) path names not supported", buffer, fd); + return; + } + } + + // 默认返回 index.html + if (!strncmp(&buffer[0], "GET /\0", 6)) strcpy(buffer, "GET /index.html"); + + // 文件类型解析 + buflen = strlen(buffer); + fstr = 0; + clock_gettime(CLOCK_MONOTONIC, &start); + for (i = 0; extensions[i].ext != 0; i++) { + len = strlen(extensions[i].ext); + if (!strncmp(&buffer[buflen - len], extensions[i].ext, len)) { + fstr = extensions[i].filetype; + break; + } + } + clock_gettime(CLOCK_MONOTONIC, &end); + duration = calculate_time_diff(start, end); + logger(LOG, "Time taken for file type detection", "", duration); + + if (fstr == 0) { + logger(FORBIDDEN, "File extension type not supported", buffer, fd); + return; + } + + // 文件打开 + clock_gettime(CLOCK_MONOTONIC, &start); + if ((file_fd = open(&buffer[5], O_RDONLY)) == -1) { + logger(NOTFOUND, "Failed to open file", &buffer[5], fd); + return; + } + clock_gettime(CLOCK_MONOTONIC, &end); + duration = calculate_time_diff(start, end); + logger(LOG, "Time taken for file opening", "", duration); + + // 文件读取与传输 + logger(LOG, "SEND", &buffer[5], hit); + clock_gettime(CLOCK_MONOTONIC, &start); + len = (long)lseek(file_fd, 0, SEEK_END); + lseek(file_fd, 0, SEEK_SET); + sprintf(buffer, + "HTTP/1.1 200 OK\nServer: nweb/%d.0\nContent-Length: %ld\nConnection: " + "close\nContent-Type: %s\n\n", + VERSION, len, fstr); + + logger(LOG, "Header", buffer, hit); + if (write(fd, buffer, strlen(buffer)) < 0) { + logger(ERROR, "Failed to write HTTP header", "", fd); + close(file_fd); + return; + } + + // 分块读取文件内容并发送 + while ((ret = read(file_fd, buffer, BUFSIZE)) > 0) { + if (write(fd, buffer, ret) < 0) { + logger(ERROR, "Failed to write file content", "", fd); + break; + } + } + clock_gettime(CLOCK_MONOTONIC, &end); + duration = calculate_time_diff(start, end); + logger(LOG, "Time taken for file transfer", "", duration); + + #ifdef DEBUG + printf("第%d个客户服务器完成\n",hit); + #endif + + // 关闭文件和套接字 + free(arg); + close(file_fd); + close(fd); +} + + + + +// 主函数,设置服务器并监听客户端连接 +int main(int argc, char **argv) { + int i, port, listenfd, socketfd, hit; + socklen_t length; + static struct sockaddr_in cli_addr; // 客户端地址 + static struct sockaddr_in serv_addr; // 服务器地址 + + // 检查命令行参数是否正确 + if (argc < 3 || argc > 3 || !strcmp(argv[1], "-?")) { + (void)printf( + "hint: webserver Port-Number Top-Directory\t\tversion %d\n\n" + "\twebserver is a small and very safe mini web server\n" + "\twebserver only servers out file/web pages with extensions named below\n" + "\t and only from the named directory or its sub-directories.\n" + "\tThere is no fancy features = safe and secure.\n\n" + "\tExample: webserver 8181 /home/oslab &\n\n" + "\tOnly Supports:", + VERSION); + for (i = 0; extensions[i].ext != 0; i++) (void)printf(" %s", extensions[i].ext); + + (void)printf( + "\n\tNot Supported: URLs including \"..\", Java, Javascript, CGI\n" + "\tNot Supported: directories / /etc /bin /lib /tmp /usr /dev /sbin \n" + "\tNo warranty given or implied\n\tNigel Griffiths nag@uk.ibm.com\n"); + exit(0); + } + + /* 设置Ctrl+C信号处理 */ + if(signal(SIGINT,ctrlc_handler)==SIG_ERR) + (void)printf("错误: 无法设置SIGINT信号处理\n"); + + if (!strncmp(argv[2], "/", 2) || !strncmp(argv[2], "/etc", 5) || !strncmp(argv[2], "/bin", 5) || + !strncmp(argv[2], "/lib", 5) || !strncmp(argv[2], "/tmp", 5) || + !strncmp(argv[2], "/usr", 5) || !strncmp(argv[2], "/dev", 5) || + !strncmp(argv[2], "/sbin", 6)) { + (void)printf("ERROR: Bad top directory %s, see nweb -?\n", argv[2]); + exit(3); + } + + // 验证并切换到指定目录 + if (chdir(argv[2]) == -1) { + perror("Failed to change directory"); + exit(4); + } + + port = atoi(argv[1]); + if (port < 1 || port > 60000) { + fprintf(stderr, "Invalid port number: %d\n", port); + exit(1); + } + // 设置服务器监听套接字 + if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + perror("Socket creation failed"); + exit(1); + } serv_addr.sin_family = AF_INET; + + /* Eliminates "Address already in use" error from bind. */ + int optval=1; + if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, + (const void *)&optval , sizeof(int)) < 0) + return -1; + + serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); + serv_addr.sin_port = htons(port); + if (bind(listenfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { + perror("Bind failed"); + exit(1); + } + if (listen(listenfd, 64) < 0) { + perror("Listen failed"); + exit(1); + } + + printf("start main\n"); + // 初始化线程池 + thpool_* pool = thpool_init(NTHREADS); + + // 接受客户端连接 + for (hit = 1;; hit++) { + length = sizeof(cli_addr); + if ((socketfd = accept(listenfd, (struct sockaddr *)&cli_addr, &length)) < 0) { + logger(ERROR, "system call", "accept", 0); + } + + param *new_param = (param*) malloc(sizeof(param)); + new_param->hit = hit; + new_param->socketfd=socketfd; + + thpool_add_work(pool,web, (void*)new_param); + } + + // 等待线程池中的所有任务执行完毕 + thpool_wait(pool); + + // 销毁线程池 + thpool_destroy(pool); + logger(LOG, "webserver exit noramlly", "", 0); + return 0; +} diff --git a/server-exp3/实验3任务报告.docx b/server-exp3/实验3任务报告.docx new file mode 100644 index 0000000000000000000000000000000000000000..ebc3ebd246ee4975bc4c046b0b143471822fb228 GIT binary patch literal 21672 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 pG=o6?wFCj