日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《CSAPP》(第3版)答案(第十一章)

發布時間:2023/12/18 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《CSAPP》(第3版)答案(第十一章) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

《CSAPP》(第3版)答案(第十一章)

P6

  • A
#include "csapp.h" void doit(int fd); void read_requesthdrs(rio_t *rp); int parse_uri(char *uri, char *filename, char *cgiargs); void serve_static(int fd, char *filename, int filesize); void get_filetype(char *filename, char *filetype); void serve_dynamic(int fd, char *filename, char *cgiargs); void clienterror(int fd, char *cause, char *errnum,char *shortmsg, char *longmsg); void echo(int connfd); int main(int argc, char **argv) {int listenfd, connfd;char hostname[MAXLINE], port[MAXLINE];socklen_t clientlen;struct sockaddr_storage clientaddr;/* Check command line args */if (argc != 2) {fprintf(stderr, "usage: %s <port>\n", argv[0]);exit(1);}listenfd = Open_listenfd(argv[1]);while (1) {clientlen = sizeof(clientaddr);connfd = Accept(listenfd, (SA *)&clientaddr, &clientlen); //line:netp:tiny:acceptGetnameinfo((SA *) &clientaddr, clientlen, hostname, MAXLINE,port, MAXLINE, 0);printf("Accepted connection from (%s, %s)\n", hostname, port);echo(connfd);Close(connfd); //line:netp:tiny:close} } void echo(int connfd) {size_t n;char buf[MAXLINE];rio_t rio;Rio_readinitb(&rio, connfd);while ((n = Rio_readlineb(&rio, buf, MAXLINE)) != 0) {if (strcmp(buf, "\r\n") == 0)break;Rio_writen(connfd, buf, n);} } /** doit - handle one HTTP request/response transaction*/ void doit(int fd) {int is_static;struct stat sbuf;char buf[MAXLINE], method[MAXLINE], uri[MAXLINE], version[MAXLINE];char filename[MAXLINE], cgiargs[MAXLINE];rio_t rio;/* Read request line and headers */Rio_readinitb(&rio, fd);if (!Rio_readlineb(&rio, buf, MAXLINE)) //line:netp:doit:readrequestreturn;printf("%s", buf);sscanf(buf, "%s %s %s", method, uri, version); //line:netp:doit:parserequestif (strcasecmp(method, "GET")) { //line:netp:doit:beginrequesterrclienterror(fd, method, "501", "Not Implemented","Tiny does not implement this method");return;} //line:netp:doit:endrequesterrread_requesthdrs(&rio); //line:netp:doit:readrequesthdrs/* Parse URI from GET request */is_static = parse_uri(uri, filename, cgiargs); //line:netp:doit:staticcheckif (stat(filename, &sbuf) < 0) { //line:netp:doit:beginnotfoundclienterror(fd, filename, "404", "Not found","Tiny couldn't find this file");return;} //line:netp:doit:endnotfoundif (is_static) { /* Serve static content */if (!(S_ISREG(sbuf.st_mode)) || !(S_IRUSR & sbuf.st_mode)) { //line:netp:doit:readableclienterror(fd, filename, "403", "Forbidden","Tiny couldn't read the file");return;}serve_static(fd, filename, sbuf.st_size); //line:netp:doit:servestatic}else { /* Serve dynamic content */if (!(S_ISREG(sbuf.st_mode)) || !(S_IXUSR & sbuf.st_mode)) { //line:netp:doit:executableclienterror(fd, filename, "403", "Forbidden","Tiny couldn't run the CGI program");return;}serve_dynamic(fd, filename, cgiargs); //line:netp:doit:servedynamic} } /** read_requesthdrs - read HTTP request headers*/ void read_requesthdrs(rio_t *rp) {char buf[MAXLINE];Rio_readlineb(rp, buf, MAXLINE);printf("%s", buf);while(strcmp(buf, "\r\n")) { //line:netp:readhdrs:checktermRio_readlineb(rp, buf, MAXLINE);printf("%s", buf);}return; } /** parse_uri - parse URI into filename and CGI args* return 0 if dynamic content, 1 if static*/ int parse_uri(char *uri, char *filename, char *cgiargs) {char *ptr;if (!strstr(uri, "cgi-bin")) { /* Static content */ //line:netp:parseuri:isstaticstrcpy(cgiargs, ""); //line:netp:parseuri:clearcgistrcpy(filename, "."); //line:netp:parseuri:beginconvert1strcat(filename, uri); //line:netp:parseuri:endconvert1if (uri[strlen(uri)-1] == '/') //line:netp:parseuri:slashcheckstrcat(filename, "home.html"); //line:netp:parseuri:appenddefaultreturn 1;}else { /* Dynamic content */ //line:netp:parseuri:isdynamicptr = index(uri, '?'); //line:netp:parseuri:beginextractif (ptr) {strcpy(cgiargs, ptr+1);*ptr = '\0';}elsestrcpy(cgiargs, ""); //line:netp:parseuri:endextractstrcpy(filename, "."); //line:netp:parseuri:beginconvert2strcat(filename, uri); //line:netp:parseuri:endconvert2return 0;} } /** serve_static - copy a file back to the client*/ void serve_static(int fd, char *filename, int filesize) {int srcfd;char *srcp, filetype[MAXLINE], buf[MAXBUF];/* Send response headers to client */get_filetype(filename, filetype); //line:netp:servestatic:getfiletypesprintf(buf, "HTTP/1.0 200 OK\r\n"); //line:netp:servestatic:beginservesprintf(buf, "%sServer: Tiny Web Server\r\n", buf);sprintf(buf, "%sConnection: close\r\n", buf);sprintf(buf, "%sContent-length: %d\r\n", buf, filesize);sprintf(buf, "%sContent-type: %s\r\n\r\n", buf, filetype);Rio_writen(fd, buf, strlen(buf)); //line:netp:servestatic:endserveprintf("Response headers:\n");printf("%s", buf);/* Send response body to client */srcfd = Open(filename, O_RDONLY, 0); //line:netp:servestatic:opensrcp = Mmap(0, filesize, PROT_READ, MAP_PRIVATE, srcfd, 0);//line:netp:servestatic:mmapClose(srcfd); //line:netp:servestatic:closeRio_writen(fd, srcp, filesize); //line:netp:servestatic:writeMunmap(srcp, filesize); //line:netp:servestatic:munmap } /** get_filetype - derive file type from file name*/ void get_filetype(char *filename, char *filetype) {if (strstr(filename, ".html"))strcpy(filetype, "text/html");else if (strstr(filename, ".gif"))strcpy(filetype, "image/gif");else if (strstr(filename, ".png"))strcpy(filetype, "image/png");else if (strstr(filename, ".jpg"))strcpy(filetype, "image/jpeg");elsestrcpy(filetype, "text/plain"); } /** serve_dynamic - run a CGI program on behalf of the client*/ void serve_dynamic(int fd, char *filename, char *cgiargs) {char buf[MAXLINE], *emptylist[] = { NULL };/* Return first part of HTTP response */sprintf(buf, "HTTP/1.0 200 OK\r\n");Rio_writen(fd, buf, strlen(buf));sprintf(buf, "Server: Tiny Web Server\r\n");Rio_writen(fd, buf, strlen(buf));if (Fork() == 0) { /* Child */ //line:netp:servedynamic:fork/* Real server would set all CGI vars here */setenv("QUERY_STRING", cgiargs, 1); //line:netp:servedynamic:setenvDup2(fd, STDOUT_FILENO); /* Redirect stdout to client */ //line:netp:servedynamic:dup2Execve(filename, emptylist, environ); /* Run CGI program */ //line:netp:servedynamic:execve}Wait(NULL); /* Parent waits for and reaps child */ //line:netp:servedynamic:wait } /** clienterror - returns an error message to the client*/ void clienterror(int fd, char *cause, char *errnum,char *shortmsg, char *longmsg) {char buf[MAXLINE], body[MAXBUF];/* Build the HTTP response body */sprintf(body, "<html><title>Tiny Error</title>");sprintf(body, "%s<body bgcolor=""ffffff"">\r\n", body);sprintf(body, "%s%s: %s\r\n", body, errnum, shortmsg);sprintf(body, "%s<p>%s: %s\r\n", body, longmsg, cause);sprintf(body, "%s<hr><em>The Tiny Web server</em>\r\n", body);/* Print the HTTP response */sprintf(buf, "HTTP/1.0 %s %s\r\n", errnum, shortmsg);Rio_writen(fd, buf, strlen(buf));sprintf(buf, "Content-type: text/html\r\n");Rio_writen(fd, buf, strlen(buf));sprintf(buf, "Content-length: %d\r\n\r\n", (int)strlen(body));Rio_writen(fd, buf, strlen(buf));Rio_writen(fd, body, strlen(body)); }
  • B
GET / HTTP/1.1 Host: localhost:5000 User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:53.0) Gecko/20100101 Firefox/53.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive
  • C
    HTTP 1.1
  • D
    rfc

P7

#include "csapp.h" void doit(int fd); void read_requesthdrs(rio_t *rp); int parse_uri(char *uri, char *filename, char *cgiargs); void serve_static(int fd, char *filename, int filesize); void get_filetype(char *filename, char *filetype); void serve_dynamic(int fd, char *filename, char *cgiargs); void clienterror(int fd, char *cause, char *errnum,char *shortmsg, char *longmsg); int main(int argc, char **argv) {int listenfd, connfd;char hostname[MAXLINE], port[MAXLINE];socklen_t clientlen;struct sockaddr_storage clientaddr;/* Check command line args */if (argc != 2) {fprintf(stderr, "usage: %s <port>\n", argv[0]);exit(1);}listenfd = Open_listenfd(argv[1]);while (1) {clientlen = sizeof(clientaddr);connfd = Accept(listenfd, (SA *)&clientaddr, &clientlen); //line:netp:tiny:acceptGetnameinfo((SA *) &clientaddr, clientlen, hostname, MAXLINE,port, MAXLINE, 0);printf("Accepted connection from (%s, %s)\n", hostname, port);doit(connfd); //line:netp:tiny:doitClose(connfd); //line:netp:tiny:close} } /** doit - handle one HTTP request/response transaction*/ void doit(int fd) {int is_static;struct stat sbuf;char buf[MAXLINE], method[MAXLINE], uri[MAXLINE], version[MAXLINE];char filename[MAXLINE], cgiargs[MAXLINE];rio_t rio;/* Read request line and headers */Rio_readinitb(&rio, fd);if (!Rio_readlineb(&rio, buf, MAXLINE)) //line:netp:doit:readrequestreturn;printf("%s", buf);sscanf(buf, "%s %s %s", method, uri, version); //line:netp:doit:parserequestif (strcasecmp(method, "GET")) { //line:netp:doit:beginrequesterrclienterror(fd, method, "501", "Not Implemented","Tiny does not implement this method");return;} //line:netp:doit:endrequesterrread_requesthdrs(&rio); //line:netp:doit:readrequesthdrs/* Parse URI from GET request */is_static = parse_uri(uri, filename, cgiargs); //line:netp:doit:staticcheckif (stat(filename, &sbuf) < 0) { //line:netp:doit:beginnotfoundclienterror(fd, filename, "404", "Not found","Tiny couldn't find this file");return;} //line:netp:doit:endnotfoundif (is_static) { /* Serve static content */if (!(S_ISREG(sbuf.st_mode)) || !(S_IRUSR & sbuf.st_mode)) { //line:netp:doit:readableclienterror(fd, filename, "403", "Forbidden","Tiny couldn't read the file");return;}serve_static(fd, filename, sbuf.st_size); //line:netp:doit:servestatic}else { /* Serve dynamic content */if (!(S_ISREG(sbuf.st_mode)) || !(S_IXUSR & sbuf.st_mode)) { //line:netp:doit:executableclienterror(fd, filename, "403", "Forbidden","Tiny couldn't run the CGI program");return;}serve_dynamic(fd, filename, cgiargs); //line:netp:doit:servedynamic} } /** read_requesthdrs - read HTTP request headers*/ void read_requesthdrs(rio_t *rp) {char buf[MAXLINE];Rio_readlineb(rp, buf, MAXLINE);printf("%s", buf);while(strcmp(buf, "\r\n")) { //line:netp:readhdrs:checktermRio_readlineb(rp, buf, MAXLINE);printf("%s", buf);}return; } /** parse_uri - parse URI into filename and CGI args* return 0 if dynamic content, 1 if static*/ int parse_uri(char *uri, char *filename, char *cgiargs) {char *ptr;if (!strstr(uri, "cgi-bin")) { /* Static content */ //line:netp:parseuri:isstaticstrcpy(cgiargs, ""); //line:netp:parseuri:clearcgistrcpy(filename, "."); //line:netp:parseuri:beginconvert1strcat(filename, uri); //line:netp:parseuri:endconvert1if (uri[strlen(uri)-1] == '/') //line:netp:parseuri:slashcheckstrcat(filename, "home.html"); //line:netp:parseuri:appenddefaultreturn 1;}else { /* Dynamic content */ //line:netp:parseuri:isdynamicptr = index(uri, '?'); //line:netp:parseuri:beginextractif (ptr) {strcpy(cgiargs, ptr+1);*ptr = '\0';}elsestrcpy(cgiargs, ""); //line:netp:parseuri:endextractstrcpy(filename, "."); //line:netp:parseuri:beginconvert2strcat(filename, uri); //line:netp:parseuri:endconvert2return 0;} } /** serve_static - copy a file back to the client*/ void serve_static(int fd, char *filename, int filesize) {int srcfd;char *srcp, filetype[MAXLINE], buf[MAXBUF];/* Send response headers to client */get_filetype(filename, filetype); //line:netp:servestatic:getfiletypesprintf(buf, "HTTP/1.0 200 OK\r\n"); //line:netp:servestatic:beginservesprintf(buf, "%sServer: Tiny Web Server\r\n", buf);sprintf(buf, "%sConnection: close\r\n", buf);sprintf(buf, "%sContent-length: %d\r\n", buf, filesize);sprintf(buf, "%sContent-type: %s\r\n\r\n", buf, filetype);Rio_writen(fd, buf, strlen(buf)); //line:netp:servestatic:endserveprintf("Response headers:\n");printf("%s", buf);/* Send response body to client */srcfd = Open(filename, O_RDONLY, 0); //line:netp:servestatic:opensrcp = Mmap(0, filesize, PROT_READ, MAP_PRIVATE, srcfd, 0);//line:netp:servestatic:mmapClose(srcfd); //line:netp:servestatic:closeRio_writen(fd, srcp, filesize); //line:netp:servestatic:writeMunmap(srcp, filesize); //line:netp:servestatic:munmap } /** get_filetype - derive file type from file name*/ void get_filetype(char *filename, char *filetype) {if (strstr(filename, ".html"))strcpy(filetype, "text/html");else if (strstr(filename, ".gif"))strcpy(filetype, "image/gif");else if (strstr(filename, ".png"))strcpy(filetype, "image/png");else if (strstr(filename, ".jpg"))strcpy(filetype, "image/jpeg");else if (strstr(filename, ".mpeg"))strcpy(filetype, "video/mpeg");elsestrcpy(filetype, "text/plain"); } /** serve_dynamic - run a CGI program on behalf of the client*/ void serve_dynamic(int fd, char *filename, char *cgiargs) {char buf[MAXLINE], *emptylist[] = { NULL };/* Return first part of HTTP response */sprintf(buf, "HTTP/1.0 200 OK\r\n");Rio_writen(fd, buf, strlen(buf));sprintf(buf, "Server: Tiny Web Server\r\n");Rio_writen(fd, buf, strlen(buf));if (Fork() == 0) { /* Child */ //line:netp:servedynamic:fork/* Real server would set all CGI vars here */setenv("QUERY_STRING", cgiargs, 1); //line:netp:servedynamic:setenvDup2(fd, STDOUT_FILENO); /* Redirect stdout to client */ //line:netp:servedynamic:dup2Execve(filename, emptylist, environ); /* Run CGI program */ //line:netp:servedynamic:execve}Wait(NULL); /* Parent waits for and reaps child */ //line:netp:servedynamic:wait } /** clienterror - returns an error message to the client*/ void clienterror(int fd, char *cause, char *errnum,char *shortmsg, char *longmsg) {char buf[MAXLINE], body[MAXBUF];/* Build the HTTP response body */sprintf(body, "<html><title>Tiny Error</title>");sprintf(body, "%s<body bgcolor=""ffffff"">\r\n", body);sprintf(body, "%s%s: %s\r\n", body, errnum, shortmsg);sprintf(body, "%s<p>%s: %s\r\n", body, longmsg, cause);sprintf(body, "%s<hr><em>The Tiny Web server</em>\r\n", body);/* Print the HTTP response */sprintf(buf, "HTTP/1.0 %s %s\r\n", errnum, shortmsg);Rio_writen(fd, buf, strlen(buf));sprintf(buf, "Content-type: text/html\r\n");Rio_writen(fd, buf, strlen(buf));sprintf(buf, "Content-length: %d\r\n\r\n", (int)strlen(body));Rio_writen(fd, buf, strlen(buf));Rio_writen(fd, body, strlen(body)); }

以上是源代碼。如果不知道怎么跑關注私信我,我把整個工程文件夾發過去。

P8

#include "csapp.h" void doit(int fd); void read_requesthdrs(rio_t *rp); int parse_uri(char *uri, char *filename, char *cgiargs); void serve_static(int fd, char *filename, int filesize); void get_filetype(char *filename, char *filetype); void serve_dynamic(int fd, char *filename, char *cgiargs); void clienterror(int fd, char *cause, char *errnum,char *shortmsg, char *longmsg); void sigchild_handler(int sig); int main(int argc, char **argv) {int listenfd, connfd;char hostname[MAXLINE], port[MAXLINE];socklen_t clientlen;struct sockaddr_storage clientaddr;/* Check command line args */if (argc != 2) {fprintf(stderr, "usage: %s <port>\n", argv[0]);exit(1);}if (Signal(SIGCHLD, sigchild_handler) == SIG_ERR)unix_error("signal child handler error");listenfd = Open_listenfd(argv[1]);while (1) {clientlen = sizeof(clientaddr);connfd = Accept(listenfd, (SA *)&clientaddr, &clientlen); //line:netp:tiny:acceptGetnameinfo((SA *) &clientaddr, clientlen, hostname, MAXLINE,port, MAXLINE, 0);printf("Accepted connection from (%s, %s)\n", hostname, port);doit(connfd); //line:netp:tiny:doitClose(connfd); //line:netp:tiny:close} } void sigchild_handler(int sig) {int old_errno = errno;int status;pid_t pid;while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {}errno = old_errno; } /** doit - handle one HTTP request/response transaction*/ void doit(int fd) {int is_static;struct stat sbuf;char buf[MAXLINE], method[MAXLINE], uri[MAXLINE], version[MAXLINE];char filename[MAXLINE], cgiargs[MAXLINE];rio_t rio;/* Read request line and headers */Rio_readinitb(&rio, fd);if (!Rio_readlineb(&rio, buf, MAXLINE)) //line:netp:doit:readrequestreturn;printf("%s", buf);sscanf(buf, "%s %s %s", method, uri, version); //line:netp:doit:parserequestif (strcasecmp(method, "GET")) { //line:netp:doit:beginrequesterrclienterror(fd, method, "501", "Not Implemented","Tiny does not implement this method");return;} //line:netp:doit:endrequesterrread_requesthdrs(&rio); //line:netp:doit:readrequesthdrs/* Parse URI from GET request */is_static = parse_uri(uri, filename, cgiargs); //line:netp:doit:staticcheckif (stat(filename, &sbuf) < 0) { //line:netp:doit:beginnotfoundclienterror(fd, filename, "404", "Not found","Tiny couldn't find this file");return;} //line:netp:doit:endnotfoundif (is_static) { /* Serve static content */if (!(S_ISREG(sbuf.st_mode)) || !(S_IRUSR & sbuf.st_mode)) { //line:netp:doit:readableclienterror(fd, filename, "403", "Forbidden","Tiny couldn't read the file");return;}serve_static(fd, filename, sbuf.st_size); //line:netp:doit:servestatic}else { /* Serve dynamic content */if (!(S_ISREG(sbuf.st_mode)) || !(S_IXUSR & sbuf.st_mode)) { //line:netp:doit:executableclienterror(fd, filename, "403", "Forbidden","Tiny couldn't run the CGI program");return;}serve_dynamic(fd, filename, cgiargs); //line:netp:doit:servedynamic} } /** read_requesthdrs - read HTTP request headers*/ void read_requesthdrs(rio_t *rp) {char buf[MAXLINE];Rio_readlineb(rp, buf, MAXLINE);printf("%s", buf);while(strcmp(buf, "\r\n")) { //line:netp:readhdrs:checktermRio_readlineb(rp, buf, MAXLINE);printf("%s", buf);}return; } /** parse_uri - parse URI into filename and CGI args* return 0 if dynamic content, 1 if static*/ int parse_uri(char *uri, char *filename, char *cgiargs) {char *ptr;if (!strstr(uri, "cgi-bin")) { /* Static content */ //line:netp:parseuri:isstaticstrcpy(cgiargs, ""); //line:netp:parseuri:clearcgistrcpy(filename, "."); //line:netp:parseuri:beginconvert1strcat(filename, uri); //line:netp:parseuri:endconvert1if (uri[strlen(uri)-1] == '/') //line:netp:parseuri:slashcheckstrcat(filename, "home.html"); //line:netp:parseuri:appenddefaultreturn 1;}else { /* Dynamic content */ //line:netp:parseuri:isdynamicptr = index(uri, '?'); //line:netp:parseuri:beginextractif (ptr) {strcpy(cgiargs, ptr+1);*ptr = '\0';}elsestrcpy(cgiargs, ""); //line:netp:parseuri:endextractstrcpy(filename, "."); //line:netp:parseuri:beginconvert2strcat(filename, uri); //line:netp:parseuri:endconvert2return 0;} } /** serve_static - copy a file back to the client*/ void serve_static(int fd, char *filename, int filesize) {int srcfd;char *srcp, filetype[MAXLINE], buf[MAXBUF];/* Send response headers to client */get_filetype(filename, filetype); //line:netp:servestatic:getfiletypesprintf(buf, "HTTP/1.0 200 OK\r\n"); //line:netp:servestatic:beginservesprintf(buf, "%sServer: Tiny Web Server\r\n", buf);sprintf(buf, "%sConnection: close\r\n", buf);sprintf(buf, "%sContent-length: %d\r\n", buf, filesize);sprintf(buf, "%sContent-type: %s\r\n\r\n", buf, filetype);Rio_writen(fd, buf, strlen(buf)); //line:netp:servestatic:endserveprintf("Response headers:\n");printf("%s", buf);/* Send response body to client */srcfd = Open(filename, O_RDONLY, 0); //line:netp:servestatic:opensrcp = Mmap(0, filesize, PROT_READ, MAP_PRIVATE, srcfd, 0);//line:netp:servestatic:mmapClose(srcfd); //line:netp:servestatic:closeRio_writen(fd, srcp, filesize); //line:netp:servestatic:writeMunmap(srcp, filesize); //line:netp:servestatic:munmap } /** get_filetype - derive file type from file name*/ void get_filetype(char *filename, char *filetype) {if (strstr(filename, ".html"))strcpy(filetype, "text/html");else if (strstr(filename, ".gif"))strcpy(filetype, "image/gif");else if (strstr(filename, ".png"))strcpy(filetype, "image/png");else if (strstr(filename, ".jpg"))strcpy(filetype, "image/jpeg");elsestrcpy(filetype, "text/plain"); } /** serve_dynamic - run a CGI program on behalf of the client*/ void serve_dynamic(int fd, char *filename, char *cgiargs) {char buf[MAXLINE], *emptylist[] = { NULL };/* Return first part of HTTP response */sprintf(buf, "HTTP/1.0 200 OK\r\n");Rio_writen(fd, buf, strlen(buf));sprintf(buf, "Server: Tiny Web Server\r\n");Rio_writen(fd, buf, strlen(buf));if (Fork() == 0) { /* Child */ //line:netp:servedynamic:fork/* Real server would set all CGI vars here */setenv("QUERY_STRING", cgiargs, 1); //line:netp:servedynamic:setenvDup2(fd, STDOUT_FILENO); /* Redirect stdout to client */ //line:netp:servedynamic:dup2Execve(filename, emptylist, environ); /* Run CGI program */ //line:netp:servedynamic:execve} } /** clienterror - returns an error message to the client*/ void clienterror(int fd, char *cause, char *errnum,char *shortmsg, char *longmsg) {char buf[MAXLINE], body[MAXBUF];/* Build the HTTP response body */sprintf(body, "<html><title>Tiny Error</title>");sprintf(body, "%s<body bgcolor=""ffffff"">\r\n", body);sprintf(body, "%s%s: %s\r\n", body, errnum, shortmsg);sprintf(body, "%s<p>%s: %s\r\n", body, longmsg, cause);sprintf(body, "%s<hr><em>The Tiny Web server</em>\r\n", body);/* Print the HTTP response */sprintf(buf, "HTTP/1.0 %s %s\r\n", errnum, shortmsg);Rio_writen(fd, buf, strlen(buf));sprintf(buf, "Content-type: text/html\r\n");Rio_writen(fd, buf, strlen(buf));sprintf(buf, "Content-length: %d\r\n\r\n", (int)strlen(body));Rio_writen(fd, buf, strlen(buf));Rio_writen(fd, body, strlen(body)); }

P9

@@ -152,12 +152,12 @@printf("Response headers:\n");printf("%s", buf);- /* Send response body to client */srcfd = Open(filename, O_RDONLY, 0); //line:netp:servestatic:open - srcp = Mmap(0, filesize, PROT_READ, MAP_PRIVATE, srcfd, 0);//line:netp:servestatic:mmap + srcp = (char*)Malloc(filesize); + Rio_readn(srcfd, srcp, filesize);Close(srcfd); //line:netp:servestatic:closeRio_writen(fd, srcp, filesize); //line:netp:servestatic:write - Munmap(srcp, filesize); //line:netp:servestatic:munmap + free(srcp);}

P10

  • A
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Tiny Server</title> </head> <body> <form action="/cgi-bin/form-adder" method="GET"><p>first number: <input type="text" name="first"/></p><p>second number: <input type="text" name="second"/></p><input type="submit" value="Submit"/> </form> </body> </html>
  • B
@@ -1,5 +1,5 @@/* - * adder.c - a minimal CGI program that adds two numbers together + * form-adder.c - a minimal CGI program that adds two numbers together*/#include "../csapp.h"@@ -12,10 +12,8 @@if ((buf = getenv("QUERY_STRING")) != NULL) {p = strchr(buf, '&');*p = '\0'; - strcpy(arg1, buf); - strcpy(arg2, p+1); - n1 = atoi(arg1); - n2 = atoi(arg2); + sscanf(buf, "first=%d", &n1); + sscanf(p+1, "second=%d", &n2);}/* Make the response body */

P11

tiny.c更改:

@@ -7,9 +7,9 @@void doit(int fd);void read_requesthdrs(rio_t *rp);int parse_uri(char *uri, char *filename, char *cgiargs); -void serve_static(int fd, char *filename, int filesize); +void serve_static(int fd, char *filename, int filesize, char *method);void get_filetype(char *filename, char *filetype); -void serve_dynamic(int fd, char *filename, char *cgiargs); +void serve_dynamic(int fd, char *filename, char *cgiargs, char *method);void clienterror(int fd, char *cause, char *errnum,char *shortmsg, char *longmsg);@@ -55,7 +55,7 @@return;printf("%s", buf);sscanf(buf, "%s %s %s", method, uri, version); //line:netp:doit:parserequest - if (strcasecmp(method, "GET")) { //line:netp:doit:beginrequesterr + if (!(strcasecmp(method, "GET") == 0 || strcasecmp(method, "HEAD") == 0)) {clienterror(fd, method, "501", "Not Implemented","Tiny does not implement this method");return; @@ -76,7 +76,7 @@"Tiny couldn't read the file");return;} - serve_static(fd, filename, sbuf.st_size); //line:netp:doit:servestatic + serve_static(fd, filename, sbuf.st_size, method); //line:netp:doit:servestatic}else { /* Serve dynamic content */if (!(S_ISREG(sbuf.st_mode)) || !(S_IXUSR & sbuf.st_mode)) { //line:netp:doit:executable @@ -84,7 +84,7 @@"Tiny couldn't run the CGI program");return;} - serve_dynamic(fd, filename, cgiargs); //line:netp:doit:servedynamic + serve_dynamic(fd, filename, cgiargs, method); //line:netp:doit:servedynamic}}@@ -136,7 +136,7 @@/** serve_static - copy a file back to the client*/ -void serve_static(int fd, char *filename, int filesize) +void serve_static(int fd, char *filename, int filesize, char *method){int srcfd;char *srcp, filetype[MAXLINE], buf[MAXBUF]; @@ -152,6 +152,9 @@printf("Response headers:\n");printf("%s", buf);+ if (strcasecmp(method, "HEAD") == 0) + return; +/* Send response body to client */srcfd = Open(filename, O_RDONLY, 0); //line:netp:servestatic:opensrcp = Mmap(0, filesize, PROT_READ, MAP_PRIVATE, srcfd, 0);//line:netp:servestatic:mmap @@ -180,7 +183,7 @@/** serve_dynamic - run a CGI program on behalf of the client*/ -void serve_dynamic(int fd, char *filename, char *cgiargs) +void serve_dynamic(int fd, char *filename, char *cgiargs, char *method){char buf[MAXLINE], *emptylist[] = { NULL };@@ -193,6 +196,7 @@if (Fork() == 0) { /* Child */ //line:netp:servedynamic:fork/* Real server would set all CGI vars here */setenv("QUERY_STRING", cgiargs, 1); //line:netp:servedynamic:setenv + setenv("REQUEST_METHOD", method, 1);Dup2(fd, STDOUT_FILENO); /* Redirect stdout to client */ //line:netp:servedynamic:dup2Execve(filename, emptylist, environ); /* Run CGI program */ //line:netp:servedynamic:execve}

addr.c更改:

@@ -1,10 +1,10 @@/* - * adder.c - a minimal CGI program that adds two numbers together + * head-adder.c - a minimal CGI program that adds two numbers together*/#include "../csapp.h"int main(void) { - char *buf, *p; + char *buf, *p, *method;char arg1[MAXLINE], arg2[MAXLINE], content[MAXLINE];int n1=0, n2=0;@@ -18,6 +18,8 @@n2 = atoi(arg2);}+ method = getenv("REQUEST_METHOD"); +/* Make the response body */sprintf(content, "Welcome to add.com: ");sprintf(content, "%sTHE Internet addition portal.\r\n<p>", content); @@ -29,7 +31,10 @@printf("Connection: close\r\n");printf("Content-length: %d\r\n", (int)strlen(content));printf("Content-type: text/html\r\n\r\n"); - printf("%s", content); + + if (strcasecmp(method, "HEAD") != 0) + printf("%s", content); +fflush(stdout);exit(0);

P12

tiny.c

@@ -5,7 +5,7 @@#include "csapp.h"void doit(int fd); -void read_requesthdrs(rio_t *rp); +int read_requesthdrs(rio_t *rp, char *method);int parse_uri(char *uri, char *filename, char *cgiargs);void serve_static(int fd, char *filename, int filesize);void get_filetype(char *filename, char *filetype); @@ -55,12 +55,14 @@return;printf("%s", buf);sscanf(buf, "%s %s %s", method, uri, version); //line:netp:doit:parserequest - if (strcasecmp(method, "GET")) { //line:netp:doit:beginrequesterr + if (!(strcasecmp(method, "GET") == 0 || strcasecmp(method, "POST") == 0)) {clienterror(fd, method, "501", "Not Implemented","Tiny does not implement this method");return;} //line:netp:doit:endrequesterr - read_requesthdrs(&rio); //line:netp:doit:readrequesthdrs + int param_len = read_requesthdrs(&rio, method); + + Rio_readnb(&rio, buf, param_len);/* Parse URI from GET request */is_static = parse_uri(uri, filename, cgiargs); //line:netp:doit:staticcheck @@ -84,24 +86,29 @@"Tiny couldn't run the CGI program");return;} - serve_dynamic(fd, filename, cgiargs); //line:netp:doit:servedynamic + if (strcasecmp(method, "GET") == 0) + serve_dynamic(fd, filename, cgiargs); + else + serve_dynamic(fd, filename, buf);}}/** read_requesthdrs - read HTTP request headers*/ -void read_requesthdrs(rio_t *rp) +int read_requesthdrs(rio_t *rp, char *method){char buf[MAXLINE]; + int len = 0;- Rio_readlineb(rp, buf, MAXLINE); - printf("%s", buf); - while(strcmp(buf, "\r\n")) { //line:netp:readhdrs:checkterm + do {Rio_readlineb(rp, buf, MAXLINE);printf("%s", buf); - } - return; + if (strcasecmp(method, "POST") == 0 && strncasecmp(buf, "Content-Length:", 15) == 0) + sscanf(buf, "Content-Length: %d", &len); + } while(strcmp(buf, "\r\n")); + + return len;

post-addr

@@ -1,5 +1,5 @@/* - * adder.c - a minimal CGI program that adds two numbers together + * post-adder.c - a minimal CGI program that adds two numbers together*/#include "../csapp.h"@@ -12,10 +12,8 @@if ((buf = getenv("QUERY_STRING")) != NULL) {p = strchr(buf, '&');*p = '\0'; - strcpy(arg1, buf); - strcpy(arg2, p+1); - n1 = atoi(arg1); - n2 = atoi(arg2); + sscanf(buf, "first=%d", &n1); + sscanf(p+1, "second=%d", &n2);}

P13

@@ -13,6 +13,17 @@void clienterror(int fd, char *cause, char *errnum,char *shortmsg, char *longmsg);+// improved rio written +void Im_rio_writen(int fd, void *usrbuf, size_t n) { + if (rio_writen(fd, usrbuf, n) != n) { + if (errno == EPIPE) + fprintf(stderr, "EPIPE error"); + + fprintf(stderr, "%s ", strerror(errno)); + unix_error("client side has ended connection"); + } +} +int main(int argc, char **argv){int listenfd, connfd; @@ -26,6 +37,9 @@exit(1);}+ if (Signal(SIGPIPE, SIG_IGN) == SIG_ERR) + unix_error("mask signal pipe error"); +listenfd = Open_listenfd(argv[1]);while (1) {clientlen = sizeof(clientaddr); @@ -148,7 +162,7 @@sprintf(buf, "%sConnection: close\r\n", buf);sprintf(buf, "%sContent-length: %d\r\n", buf, filesize);sprintf(buf, "%sContent-type: %s\r\n\r\n", buf, filetype); - Rio_writen(fd, buf, strlen(buf)); //line:netp:servestatic:endserve + Im_rio_writen(fd, buf, strlen(buf)); //line:netp:servestatic:endserveprintf("Response headers:\n");printf("%s", buf);@@ -156,7 +170,7 @@srcfd = Open(filename, O_RDONLY, 0); //line:netp:servestatic:opensrcp = Mmap(0, filesize, PROT_READ, MAP_PRIVATE, srcfd, 0);//line:netp:servestatic:mmapClose(srcfd); //line:netp:servestatic:close - Rio_writen(fd, srcp, filesize); //line:netp:servestatic:write + Im_rio_writen(fd, srcp, filesize); //line:netp:servestatic:writeMunmap(srcp, filesize); //line:netp:servestatic:munmap}@@ -186,11 +200,13 @@/* Return first part of HTTP response */sprintf(buf, "HTTP/1.0 200 OK\r\n"); - Rio_writen(fd, buf, strlen(buf)); + Im_rio_writen(fd, buf, strlen(buf));sprintf(buf, "Server: Tiny Web Server\r\n"); - Rio_writen(fd, buf, strlen(buf)); + Im_rio_writen(fd, buf, strlen(buf));if (Fork() == 0) { /* Child */ //line:netp:servedynamic:fork + if (Signal(SIGPIPE, SIG_DFL) == SIG_ERR) + unix_error("unmask signal pipe error");/* Real server would set all CGI vars here */setenv("QUERY_STRING", cgiargs, 1); //line:netp:servedynamic:setenvDup2(fd, STDOUT_FILENO); /* Redirect stdout to client */ //line:netp:servedynamic:dup2 @@ -216,10 +232,10 @@/* Print the HTTP response */sprintf(buf, "HTTP/1.0 %s %s\r\n", errnum, shortmsg); - Rio_writen(fd, buf, strlen(buf)); + Im_rio_writen(fd, buf, strlen(buf));sprintf(buf, "Content-type: text/html\r\n"); - Rio_writen(fd, buf, strlen(buf)); + Im_rio_writen(fd, buf, strlen(buf));sprintf(buf, "Content-length: %d\r\n\r\n", (int)strlen(body)); - Rio_writen(fd, buf, strlen(buf)); - Rio_writen(fd, body, strlen(body)); + Im_rio_writen(fd, buf, strlen(buf)); + Im_rio_writen(fd, body, strlen(body));}

第十一章 完

總結

以上是生活随笔為你收集整理的《CSAPP》(第3版)答案(第十一章)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

在线观看av小说 | 久久99精品久久只有精品 | 日韩欧美在线中文字幕 | 国产在线高清视频 | 国产无遮挡猛进猛出免费软件 | 国产一区私人高清影院 | 成人在线免费观看网站 | 欧美日韩视频一区二区三区 | 日日夜夜综合网 | 去看片 | 天天干天天玩天天操 | 激情 婷婷 | 亚洲欧洲精品一区二区精品久久久 | 免费黄a大片 | 伊人干综合 | 麻豆免费视频网站 | 免费在线黄网 | 97人人爽人人 | 国产精品激情偷乱一区二区∴ | 久久国产精品一二三区 | 丝袜美腿一区 | 亚洲激情 在线 | 午夜电影av | 久久国产一二区 | 亚洲国产精品一区二区久久hs | 日韩欧美一区二区在线播放 | 探花在线观看 | 久草在线最新 | 精品国产一二三 | 91av视频免费在线观看 | 亚洲视频在线观看 | 国产精品porn | 久久一区91 | 国产精品专区在线 | 一区久久久 | 黄色小说视频在线 | 天天干夜夜操视频 | 98精品国产自产在线观看 | 亚洲成a人片在线观看网站口工 | 色综合中文综合网 | 特级西西444www大精品视频免费看 | 亚洲人xxx | 久草精品在线播放 | 女女av在线 | 国产又粗又猛又黄又爽的视频 | 久久午夜剧场 | 在线免费黄色av | 欧美一级激情 | 久久99热精品这里久久精品 | 免费视频一二三 | 亚洲狠狠婷婷综合久久久 | 973理论片235影院9 | 欧美午夜久久久 | 2019中文最近的2019中文在线 | 婷婷色网站 | 日本中文字幕在线免费观看 | 久久久久国 | 99精品毛片 | 97在线成人 | 奇米网在线观看 | 日韩在线免费小视频 | 超碰在线cao | 婷久久 | 国产香蕉视频在线观看 | 午夜精品视频在线 | 婷婷久月 | 精品国产99 | 97精品国产91久久久久久 | 中文字幕一区二区三区久久蜜桃 | 成人av在线一区二区 | 欧美一二在线 | 五月婷婷六月丁香激情 | 最新日韩精品 | 欧美精品在线视频观看 | 日本精品视频免费观看 | 欧美日韩精品二区第二页 | 日本三级大片 | 欧美精品你懂的 | 深夜免费福利网站 | 亚洲乱码久久久 | 午夜精品视频在线 | 婷婷综合亚洲 | av久久久 | 亚洲va韩国va欧美va精四季 | 亚洲女欲精品久久久久久久18 | 三级大片网站 | 亚洲va欧美va人人爽春色影视 | 亚洲人人av | 最近中文字幕视频完整版 | 人人干人人超 | 欧洲高潮三级做爰 | 久久爽久久爽久久av东京爽 | 国产精品久久久久久久久久久久午夜 | 热久久免费国产视频 | 国产精品第三页 | 97超碰中文字幕 | 精品亚洲一区二区 | 久久天天躁 | 99精品免费久久久久久日本 | 日韩免费电影一区二区三区 | www.av中文字幕.com | 亚洲污视频 | 亚洲精色 | 992tv又爽又黄的免费视频 | 2019中文字幕网站 | 亚洲天天在线 | 日韩av中文在线观看 | 久久久久国产精品免费免费搜索 | 伊人精品影院 | 一区二区观看 | 国产三级精品在线 | 欧美日韩天堂 | 国产流白浆高潮在线观看 | 911精品美国片911久久久 | av成人资源 | 夜夜操狠狠干 | 免费看黄网站在线 | 成 人 黄 色 片 在线播放 | 免费在线观看日韩 | 日韩经典一区二区三区 | 亚洲jizzjizz日本少妇 | 色婷婷导航 | 国产九九热视频 | 天天色天天操天天爽 | 日韩一级精品 | 成人蜜桃 | 国产精品久久免费看 | 成人免费亚洲 | 免费观看一级一片 | 日韩欧美国产激情在线播放 | 九色琪琪久久综合网天天 | 亚洲免费公开视频 | 一区二区三区免费 | 色综合激情网 | 91麻豆精品国产91久久久久久 | 亚洲免费av网站 | 日本激情动作片免费看 | 国产精品一区二区精品视频免费看 | 99久久精品费精品 | 少妇视频一区 | 91丨九色丨91啦蝌蚪老版 | 成人免费看电影 | 亚洲成人黄色 | 亚洲精品视频 | 91丨九色丨91啦蝌蚪老版 | 天天操天天干天天爱 | 国产伦精品一区二区三区照片91 | 日本女人b | 在线91播放 | 国产精品字幕 | 国产69精品久久久久99 | 美女久久久久 | 日本黄色免费电影网站 | 高潮久久久 | av大片免费在线观看 | 色综合中文字幕 | 在线观看色视频 | 亚洲婷婷在线 | 国产美腿白丝袜足在线av | 天天插天天 | 久久论理 | 婷婷激情综合网 | 一区二区三区在线免费播放 | 久久精品99国产精品亚洲最刺激 | 国内精自线一二区永久 | 亚洲成av人片在线观看香蕉 | 天天爱天天爽 | 免费麻豆视频 | 亚洲香蕉视频 | 亚洲黄色软件 | 91精品在线观看视频 | 波多野结衣精品在线 | 国内精品久久久久久久久久久久 | 91九色丨porny丨丰满6 | 国内精品久久久精品电影院 | 久久久久| 国产精品9999 | 婷婷综合久久 | 黄色不卡av| 四虎在线视频免费观看 | 国产精品成人免费精品自在线观看 | 国产98色在线 | 日韩 | 中文字幕在线播放第一页 | 欧美日韩精品在线观看 | 欧美性生交大片免网 | av黄免费看| 亚洲精品在线观看免费 | 一区二区三区免费在线观看 | 五月婷婷国产 | 国产一区观看 | av网站在线免费观看 | 欧美日韩久久一区 | 日韩三级在线 | 九九免费在线视频 | 日韩激情中文字幕 | 成年人在线免费视频观看 | 久久不射电影网 | av在线超碰 | 国产一区二区久久精品 | 狠狠狠色丁香婷婷综合久久五月 | 最新国产一区二区三区 | 黄色一级大片在线观看 | 国产日韩在线播放 | 成人一区二区在线 | 免费看特级毛片 | 国产午夜精品av一区二区 | 亚洲精品美女久久久久网站 | 国产在线观看,日本 | 在线免费国产视频 | 国产精品ssss在线亚洲 | 日韩高清不卡在线 | 亚洲一区二区三区在线看 | 亚洲人成影院在线 | 欧美少妇xx | 久久久一本精品99久久精品 | 7777xxxx| 亚洲精品动漫久久久久 | 色久天| 99视频在线观看视频 | 18网站在线观看 | 91亚洲精品乱码久久久久久蜜桃 | 国产麻豆电影 | 激情五月综合 | 麻豆va一区二区三区久久浪 | 狠狠插狠狠干 | 亚洲在线看 | 亚洲最新av网址 | 久久综合久色欧美综合狠狠 | 亚洲成成品网站 | 日韩精品免费在线观看视频 | 国产日韩欧美在线免费观看 | 国内精品在线一区 | 亚洲免费婷婷 | 成人毛片一区二区三区 | 国产亚洲午夜高清国产拍精品 | 国产清纯在线 | 国内视频在线观看 | 午夜免费电影院 | 国产成人一二三 | 五月在线 | 国产高清永久免费 | 六月丁香激情综合色啪小说 | 久久精品国产精品亚洲 | 欧美日韩免费一区二区 | 精品久久久久久电影 | 免费亚洲电影 | 久久久国产精品亚洲一区 | 成人免费视频网站 | 天天综合网 天天综合色 | 国产精品99久久免费黑人 | 人人澡人人干 | 天天操网站 | 欧美在线视频一区二区三区 | 精品国产精品久久一区免费式 | 久久经典国产视频 | 亚洲成人av电影 | 久久黄色精品视频 | 97成人精品 | 免费 在线 中文 日本 | 亚洲91在线 | 97精品国产一二三产区 | 麻豆视频在线观看免费 | 91亚洲精品视频 | 美女黄网久久 | 欧美a视频 | 亚洲一级特黄 | 美女视频永久黄网站免费观看国产 | 操操操影院 | 亚洲综合狠狠干 | 久热这里有精品 | 久久艹综合 | 九九视频精品在线 | 久久伊人婷婷 | 丁香六月久久综合狠狠色 | 国产成人在线观看免费 | 日韩精品一区二区久久 | 日韩在线观看视频中文字幕 | 久久综合狠狠综合久久狠狠色综合 | 亚洲 欧美 日韩 综合 | av免费网页 | 六月色婷 | aav在线| 中文字幕91在线 | 麻豆国产视频下载 | 久久国产影视 | 国产精品精品久久久 | 亚洲成人高清在线 | 亚洲国产成人高清精品 | 最近免费在线观看 | 午夜的福利 | 黄色av网站在线观看免费 | 在线亚洲成人 | 亚洲激情小视频 | 天天综合网 天天 | 麻豆传媒在线视频 | 精品国产理论 | 亚洲精品久久久久久国 | 九九久久精品 | 女人久久久久 | 99色在线观看视频 | 婷婷在线不卡 | 亚洲乱亚洲乱妇 | 91视频在线观看免费 | 国产又粗又猛又色 | 成人午夜毛片 | 日韩在线观看网址 | 福利视频一区二区 | 久草视频视频在线播放 | 国产成人香蕉 | 国产精品欧美久久久久无广告 | 国产精品一区二区三区免费看 | 欧美黑吊大战白妞欧美 | 不卡视频国产 | 国产专区在线视频 | 久久精品国产精品亚洲 | 国产一区免费观看 | 国产短视频在线播放 | 日韩免费电影一区二区三区 | 国产麻豆视频 | 国产精品理论在线观看 | 欧美激情精品久久久久久变态 | 久久国产精品第一页 | 国产剧情亚洲 | 成人午夜片av在线看 | avsex| 免费看黄电影 | 91精品啪 | 欧美一区二区三区四区夜夜大片 | 一级黄色免费网站 | 男女视频久久久 | 欧美久久精品 | 天天操天天添 | 亚洲 欧美 另类人妖 | 99久热精品 | 在线观看岛国 | 欧美日韩调教 | 日本黄色一级电影 | 三级在线视频播放 | 日本久久成人 | 韩国一区在线 | 91精品国产三级a在线观看 | 激情黄色av| 最近免费中文字幕mv在线视频3 | 日韩成人欧美 | 三级性生活视频 | 免费成人在线视频网站 | 麻豆视频免费入口 | 亚洲1级片| 在线观看日韩专区 | 免费91在线 | 黄网av在线 | 国产成人福利片 | 国产精品爽爽久久久久久蜜臀 | 国产黄色精品在线 | 久久99热这里只有精品 | 国产精品欧美久久久久三级 | 五月婷婷操 | 国产精品综合久久久久久 | 国产一区二区在线免费 | 日韩中文字幕免费在线播放 | 一二三区av | 国产裸体永久免费视频网站 | 综合久久影院 | 99r在线 | 97理论片| 黄色三级在线 | 国产亚州精品视频 | 国产精品色婷婷视频 | www好男人 | 天天操天天摸天天干 | 久久久久久在线观看 | 一区二区三区在线免费观看 | 在线免费观看视频a | 爱色婷婷| www.av免费| 免费看一级特黄a大片 | 成人性生交大片免费观看网站 | 91福利视频久久久久 | 国产天天综合 | 麻豆国产在线视频 | 91爱看片| 天天夜操 | 久久国产系列 | 欧美综合色在线图区 | 国产精品永久在线观看 | 日韩精品首页 | 色视频在线免费 | 国产91对白在线 | 婷婷精品国产欧美精品亚洲人人爽 | 日韩在线观看第一页 | 日韩成人欧美 | 免费av观看 | 国产精品久久久久久久久久不蜜月 | 日日操网站 | 粉嫩av一区二区三区四区五区 | 一级特黄aaa大片在线观看 | 区一区二区三在线观看 | 欧美在线视频一区二区三区 | 91精品久久久久久久99蜜桃 | 国产在线观看一区 | 日韩专区 在线 | 亚洲综合在线视频 | 国产视频一区二区在线播放 | 国产一区私人高清影院 | 人人艹视频 | 高清日韩一区二区 | 国产99免费视频 | 久久综合久久综合久久 | 国产亚洲视频在线 | 天天操天天色天天射 | 一区二区三区在线免费观看 | 国产精品亚洲视频 | 超碰在线人人艹 | 日韩伦理一区二区三区av在线 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 欧美性黄网官网 | 九九在线国产视频 | 成人午夜片av在线看 | 中文字幕免费高清在线观看 | 亚洲综合色播 | 国产一二区免费视频 | 色婷婷综合久久久久中文字幕1 | 免费网站黄 | 久久99久久99精品免观看粉嫩 | 激情视频网页 | 国产区欧美 | 在线观看香蕉视频 | 色在线高清 | 在线观看视频你懂得 | 精品国产日本 | 久久涩视频 | 在线观看一区 | 久久狠狠干| 国产精品一区二区av日韩在线 | 激情婷婷在线观看 | 四虎在线观看精品视频 | 国产91精品看黄网站在线观看动漫 | 久久在视频| 一区二区三区av在线 | 91在线入口| 国产玖玖在线 | 亚洲爱av | 欧美激情视频一二区 | 丰满少妇久久久 | 亚洲www天堂com | 香蕉视频一级 | 久久精品福利视频 | 亚洲精选国产 | 久草视频视频在线播放 | 成人影音在线 | av在线播放中文字幕 | 九月婷婷人人澡人人添人人爽 | 97在线视 | 中文字幕电影在线 | 最近中文字幕在线播放 | 国产午夜精品一区二区三区四区 | 欧美淫视频| 99久久超碰中文字幕伊人 | 久插视频 | 色福利网 | 一区二区免费不卡在线 | 欧美日韩在线观看不卡 | 激情婷婷丁香 | 国产三级视频 | 激情视频免费观看 | 中文字幕在线视频免费播放 | 国产精品99久久久久久久久 | 久久久久综合精品福利啪啪 | 天堂va在线高清一区 | 在线视频精品播放 | 国产一级高清 | 在线观看视频三级 | 久久国产色 | 精品一区91| 亚洲国产mv | 日韩有码第一页 | 在线视频 一区二区 | 成人a视频在线观看 | 国产 日韩 在线 亚洲 字幕 中文 | 2019天天干天天色 | 亚洲精品视频久久 | 96国产在线 | 成人羞羞免费 | 色91在线| 欧美精品在线免费 | 有码视频在线观看 | 深夜男人影院 | 麻豆91在线看 | av福利电影 | 视频福利在线 | 五月天久久狠狠 | 超碰免费观看 | 亚洲午夜精品在线观看 | 午夜av剧场 | 99国产精品久久久久久久久久 | 天天操天天射天天添 | 欧美午夜a | 亚洲国产片色 | 亚洲第一区在线观看 | 亚洲精品一区二区三区新线路 | 日韩高清毛片 | av片子在线观看 | 亚洲va欧洲va国产va不卡 | 国产区第一页 | 99日韩精品| 亚洲国产中文在线 | 人人干人人上 | 欧美成人精品欧美一级乱黄 | 美女精品久久久 | 色综合综合 | 亚洲香蕉视频 | 久久精品在线视频 | free. 性欧美.com | 在线观看的a站 | 97超碰成人 | 免费av高清| 免费一级黄色 | 国产免费久久久久 | 午夜视频在线观看一区二区三区 | 久操视频在线播放 | 九九三级毛片 | 国产香蕉视频 | 国产视频二区三区 | 91精品夜夜 | 免费中文字幕在线观看 | 日韩免费播放 | 亚洲精品88欧美一区二区 | 国产成人综合在线观看 | 免费av大片 | 久章草在线观看 | 免费a视频 | 国产高清精 | 黄色小说视频在线 | www.色就是色 | 国产在线视频一区二区 | 日韩色爱 | 国产精品久久久久久久久久东京 | 国产色综合 | www免费看片com | 久久99热久久99精品 | 国产无限资源在线观看 | 精品91在线 | 成人av资源在线 | 日韩高清二区 | 色婷婷综合久久久久中文字幕1 | 久久久免费精品视频 | av福利在线| 亚洲精品视 | 欧美激情片在线观看 | 中文字幕在线播放第一页 | 日韩欧美在线观看一区二区三区 | 日本深夜福利视频 | av三级在线看 | 中文在线字幕免费观看 | 日韩激情久久 | 中国一 片免费观看 | 日本久久久久久久久 | 九九九在线观看 | 一级做a视频 | 国产精品扒开做爽爽的视频 | 国产呻吟在线 | 超碰在线日韩 | 黄色一级在线免费观看 | 久草视频在线资源站 | 午夜视频在线观看一区二区三区 | 国产99久久九九精品 | 一区二区三区不卡在线 | 丝袜美腿亚洲综合 | 激情综合啪| 日韩美女一级片 | 99久久www| 国产精品6999成人免费视频 | 亚洲精品a区| 国产手机在线 | 天天天天色综合 | 亚洲视频播放 | 国产精品久久久亚洲 | 免费看网站在线 | 99精彩视频在线观看免费 | 久久精品视频网址 | 亚洲国产美女久久久久 | 69国产成人综合久久精品欧美 | 九九视频在线观看视频6 | 日韩一区精品 | www.午夜 | 国产高清视频 | 日本大片免费观看在线 | 91成品人影院| 美女国产网站 | 黄色三级免费片 | 黄色一及电影 | 免费影视大全推荐 | 九九视频在线 | 91超碰免费在线 | 日韩深夜在线观看 | 欧美日韩久 | 国产亚洲精品女人久久久久久 | 天天干人人干 | 成人在线免费小视频 | 狠狠干狠狠久久 | 久久久久久高潮国产精品视 | 久草在线资源观看 | 国产午夜精品一区二区三区在线观看 | 欧美日韩在线观看视频 | 国产专区一| 国产精品免费视频一区二区 | 久久精品国产精品亚洲 | 日韩1级片 | 亚洲国产人午在线一二区 | 国产免费嫩草影院 | 成人福利在线播放 | 黄色软件在线看 | 亚洲精品一区二区三区高潮 | 一级片色播影院 | 日韩电影在线一区 | 国产裸体无遮挡 | av看片网址 | 色多多视频在线观看 | 久久天天躁夜夜躁狠狠85麻豆 | 国产成人精品999在线观看 | 中文字幕av日韩 | 日本精品视频网站 | 欧美精品少妇xxxxx喷水 | 日韩欧美一区二区在线观看 | 亚洲欧美日韩精品一区二区 | 国产精品18久久久久久久网站 | 精品久久网 | 高清一区二区三区 | 免费99视频 | 婷婷在线精品视频 | 午夜免费福利视频 | 精品国产一二三四区 | 久久精品国产99国产 | 精品毛片一区二区免费看 | 日韩欧美一区二区三区视频 | 黄视频网站大全 | 亚洲网站在线看 | 在线 高清 中文字幕 | 中文字幕亚洲高清 | 亚洲精品视频大全 | 亚洲码国产日韩欧美高潮在线播放 | 黄色国产高清 | 国产麻豆精品久久 | 国产免费三级在线观看 | 免费视频区 | 国产片免费在线观看视频 | 中文字幕亚洲欧美日韩2019 | 国产中文字幕三区 | 麻豆一级视频 | 欧美日韩国产一区二 | 亚洲天天干 | 成人视屏免费看 | 81精品国产乱码久久久久久 | 黄色片毛片 | 亚洲动漫在线观看 | 成年人在线 | 久久超级碰视频 | 亚州欧美视频 | 天天射天天干天天插 | av在线免费播放 | av成人免费网站 | 亚洲精品456在线播放第一页 | 中文字幕在线免费观看 | 99久久夜色精品国产亚洲96 | 成人黄色av免费在线观看 | 一区久久久 | 热久久免费视频精品 | 91精品在线播放 | 精品五月天 | 日韩精品在线看 | 国产精品免费一区二区三区在线观看 | 欧美一级视频一区 | 亚洲天堂网站视频 | 亚一亚二国产专区 | 久草在线中文视频 | 狠狠操操| 国产二区精品 | 欧美 国产 视频 | 精品人人人人 | 欧美片网站yy | 久久精品黄 | 中文字幕91 | 国产又粗又硬又爽视频 | 日韩网站视频 | 日韩v欧美v日本v亚洲v国产v | av888.com | 国产精品一区二区av麻豆 | av免费福利 | 美女中文字幕 | 在线影视 一区 二区 三区 | 69中文字幕 | 丁香午夜 | 91久久精品日日躁夜夜躁国产 | 久久乐九色婷婷综合色狠狠182 | 黄色综合 | 国产乱码精品一区二区蜜臀 | 国产日本亚洲高清 | av在线免费不卡 | 99精品热视频 | 欧美一级xxxx| 色婷婷在线观看视频 | 免费精品视频在线观看 | 黄色免费观看 | 久久婷婷丁香 | 亚洲精品999 | 丁香婷婷色综合亚洲电影 | 欧美日韩免费视频 | 91视频这里只有精品 | 久日视频 | 草久在线| 午夜国产在线 | 一区二区视 | 国产精品theporn | 国产精品9999久久久久仙踪林 | 天天摸天天操天天舔 | 日韩三级免费 | 国产字幕av | 日韩午夜三级 | 国产一区二区在线免费观看 | 久久亚洲区 | 精品久久91 | 激情综合色图 | 色婷婷久久一区二区 | 成年人视频免费在线播放 | 成人国产精品免费 | 久久激情五月激情 | 97成人精品区在线播放 | 91精品对白一区国产伦 | 中文字幕免费 | 久久五月天综合 | 91精品国产91热久久久做人人 | 97免费视频在线播放 | 99精品偷拍视频一区二区三区 | 岛国片在线 | 操操操日日日干干干 | 国内外成人在线视频 | 国产资源av| 国产精品视频大全 | 亚洲国产三级在线 | 黄色www免费 | 偷拍视频一区 | 久草视频在线资源站 | 亚洲综合导航 | 91久久国产自产拍夜夜嗨 | 日韩精品一区在线观看 | 999久久久欧美日韩黑人 | 91视频久久久久久 | 久草在线高清视频 | 国产99久久久国产精品成人免费 | 插插插色综合 | 欧美久久久久久久久久久久久 | 又黄又刺激又爽的视频 | 91麻豆精品国产91久久久使用方法 | 国内精品久久天天躁人人爽 | 国产精品久久在线观看 | 天天干天天看 | 综合久久综合久久 | 欧美在线视频日韩 | 日本天天操 | 99精品国产高清在线观看 | 午夜精品中文字幕 | 国产va在线 | 456成人精品影院 | 国产精品毛片一区二区在线看 | 国产成人精品日本亚洲999 | 在线免费观看黄网站 | 国产精品欧美久久久久无广告 | 亚洲欧美视频一区二区三区 | 国产视频精品久久 | 三级av网| 欧美人体xx | 在线免费观看视频一区二区三区 | 一级一片免费观看 | 色香蕉在线视频 | 国产97av | 亚洲精品国产自产拍在线观看 | 欧美日韩亚洲在线观看 | 亚洲国产精品va在线看黑人 | 天天天天色射综合 | 日韩久久网站 | 亚洲精品九九 | 91成版人在线观看入口 | 国产999久久久 | 成年人国产在线观看 | 国产精品99久久久久人中文网介绍 | 在线激情影院一区 | 丰满少妇麻豆av | 免费看特级毛片 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 五月婷亚洲| 一区二区高清在线 | 成人av免费在线播放 | 中文字幕一区二区三 | 五月天.com | 国内综合精品午夜久久资源 | 美女搞黄国产视频网站 | 五月综合激情网 | 99精品视频在线观看播放 | 亚洲专区 国产精品 | 五月天综合色 | 伊人伊成久久人综合网站 | 色婷婷福利 | www.久久久久 | 中文字幕区 | 久久久久久久久久久久99 | 99久久久久久久 | 国产一区黄色 | av福利在线免费观看 | 最新一区二区三区 | 精品国产伦一区二区三区观看说明 | 国产一级片久久 | 综合色中文 | 丁香5月婷婷 | 久久经典国产 | 探花视频免费观看 | 久久字幕精品一区 | 在线观看亚洲 | 91精品久久久久久久久 | 能在线观看的日韩av | 九九热只有这里有精品 | 成年人精品 | 国产一区二区三区视频在线 | 日本视频精品 | 欧美不卡在线 | 91精品国产综合久久福利不卡 | 黄p在线播放 | 中文字幕免费观看视频 | 一区二区三区污 | 欧美最爽乱淫视频播放 | 亚洲免费a | 碰天天操天天 | 狠狠的操狠狠的干 | 精品视频久久久 | 亚洲精品色 | 久草网首页 | 91黄在线看 | 久热久草 | 国产女教师精品久久av | 中文字幕在线观看视频网站 | 国产精品18久久久久久首页狼 | 亚洲激情六月 | 欧美在线视频第一页 | 免费又黄又爽的视频 | 成人免费xxx在线观看 | 日日夜夜亚洲 | 天天射天天干天天 | 日韩在线中文字幕 | 亚洲少妇xxxx | 91精选| 国产精品久久久久久久久久了 | 免费看污的网站 | 久久综合久久久久88 | 日韩在线视频二区 | 久久亚洲欧美日韩精品专区 | 深夜免费小视频 | caobi视频 | 一区二区三区免费在线观看视频 | 一区二区三区电影在线播 | 婷婷丁香六月 | 欧美在线观看视频一区二区三区 | 91免费在线视频 | 日韩av一区在线观看 | 久久成电影 | 国产专区在线播放 | 成人资源在线观看 | 五月天综合 | 一区二区 不卡 | 综合网在线视频 | 国产乱视频 | av在线免费不卡 | 色婷婷免费 | 免费在线观看视频a | 欧美黄色软件 | 麻豆一区在线观看 | 天天综合网久久综合网 | 成人一级影视 | av超碰免费在线 | 亚洲精品国产精品国自产在线 | 亚洲综合日韩在线 | 精品一区二区在线看 | 特级毛片在线免费观看 | 999男人的天堂 | 久草在线视频国产 | 国产一区久久 | 久久久久婷 | 免费高清男女打扑克视频 | 婷婷五情天综123 | 亚洲一区不卡视频 | 日韩精品中文字幕在线播放 | 9797在线看片亚洲精品 | 五月天激情视频 | 黄色免费观看视频 | 欧美资源在线观看 | 丁香花五月| 欧美一区在线观看视频 | 国产精品精品国产婷婷这里av | 看片黄网站 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 免费成人av电影 | www.久久婷婷| 色噜噜日韩精品一区二区三区视频 | 激情五月婷婷激情 | 欧美日韩精品电影 | 国产自在线 | 国产成人一区二区精品非洲 | 夜色资源站国产www在线视频 | 精品久久一级片 | 日韩一级黄色大片 | 日日弄天天弄美女bbbb | 日韩一区二区三区在线看 | 欧美另类xxx | 欧美精品首页 | 在线国产欧美 | 亚洲综合黄色 | 成人资源网 | 亚洲日日夜夜 | 成人免费观看在线视频 | 一区免费在线 | 欧美一级片在线观看视频 | 亚洲视频在线播放 | 色资源网免费观看视频 | 国产精品va视频 | 综合黄色网 | 久久免费视频播放 | 精品视频在线视频 | 欧美精品天堂 | 国产精品日韩久久久久 | 久久99久久99精品 | 久久超碰99| 国产超碰在线 | 久久精品视频99 | 91日韩在线专区 | 日韩在线视频在线观看 | 色视频网站在线观看一=区 a视频免费在线观看 | 99久久99精品 | 色综合小说 | 久av电影| 成人高清av在线 | 涩涩网站在线 | 成人免费视频网站在线观看 | 天天躁天天狠天天透 | 欧美久久久久久久久中文字幕 | 在线小视频 | 欧洲黄色片 | 欧美国产精品一区二区 | 日韩在线视 | 超碰在线98| 日韩国产在线观看 | 美女视频永久黄网站免费观看国产 | 激情婷婷在线观看 | 免费在线观看不卡av | 欧美伦理电影一区二区 | 欧美日韩p片 | japanesexxx乱女另类 | 美女久久 | 久久99久久久久久 | 色综合激情久久 | 中文字幕av免费 | 国产精品免费视频网站 | 国产精品精品国产婷婷这里av | 亚洲我射av| 亚洲国产午夜 | 精品一区二区综合 | 国产精品美女视频网站 | 欧美日韩免费一区 | 五月开心色| 欧美精品你懂的 | 日本精品中文字幕在线观看 | 少妇搡bbbb搡bbb搡69 | 精品国产伦一区二区三区 | 国产精品11| 久久久精品久久 | 人人干,人人爽 | 一区二区 不卡 | av在线超碰 | 成年人app网址 | 国产精品久久一区二区三区, | 91精品免费在线 | 日韩欧美在线播放 | 6080yy午夜一二三区久久 | 在线影院av| 日韩高清一区 | 免费在线色电影 | 日韩av午夜在线观看 | 精品亚洲国产视频 | 国产麻豆果冻传媒在线观看 | 国产色女 | 国产精品久久久久久超碰 | 亚洲综合最新在线 | 亚洲成年片| 久久国产亚洲精品 | 国产精品久久二区 | 中文字幕在线观看第一页 | 奇米先锋 | 久久久黄视频 | 啪啪免费观看网站 | 亚洲激情视频在线 | 国产高清视频在线播放 |