⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 codeexm6.txt

📁 《计算机网络与因特网》(原书第4版) 作者:Douglas Comer博士 出版社:机械工业出版社 书中例子的代码
💻 TXT
字号:
<HTML><HEAD><TITLE>NETBOOK - Code Sample EXM6</TITLE></HEAD><BODY><pre>/* webserver.c */#include &lt;stdio.h>#include &lt;stdlib.h>#include &lt;time.h>#include &lt;cnaiapi.h>#if defined(LINUX) || defined(SOLARIS)#include &lt;sys/time.h>#endif#define BUFFSIZE	256#define SERVER_NAME	"CNAI Demo Web Server"#define ERROR_400	"&lt;head>&lt;/head>&lt;body>&lt;html>&lt;h1>Error 400&lt;/h1>&lt;p>Th\e server couldn't understand your request.&lt;/html>&lt;/body>\n"#define ERROR_404	"&lt;head>&lt;/head>&lt;body>&lt;html>&lt;h1>Error 404&lt;/h1>&lt;p>Do\cument not found.&lt;/html>&lt;/body>\n"#define HOME_PAGE	"&lt;head>&lt;/head>&lt;body>&lt;html>&lt;h1>Welcome to the CNAI\ Demo Server&lt;/h1>&lt;p>Why not visit: &lt;ul>&lt;li>&lt;a href=\"http://netbook.cs.pu\rdue.edu\">Netbook Home Page&lt;/a>&lt;li>&lt;a href=\"http://www.comerbooks.com\"\>Comer Books Home Page&lt;a>&lt;/ul>&lt;/html>&lt;/body>\n"#define TIME_PAGE	"&lt;head>&lt;/head>&lt;body>&lt;html>&lt;h1>The current date is\: %s&lt;/h1>&lt;/html>&lt;/body>\n"int	recvln(connection, char *, int);void	send_head(connection, int, int);/*----------------------------------------------------------------------- * * Program: webserver * Purpose: serve hard-coded webpages to web clients * Usage:   webserver &lt;appnum> * *----------------------------------------------------------------------- */intmain(int argc, char *argv[]){	connection	conn;	int		n;	char		buff[BUFFSIZE], cmd[16], path[64], vers[16];	char		*timestr;#if defined(LINUX) || defined(SOLARIS)	struct timeval	tv;#elif defined(WIN32)	time_t          tv;#endif	if (argc != 2) {		(void) fprintf(stderr, "usage: %s &lt;appnum>\n", argv[0]);		exit(1);	}	while(1) {		/* wait for contact from a client on specified appnum */		conn = await_contact((appnum) atoi(argv[1]));		if (conn &lt; 0)			exit(1);		/* read and parse the request line */		n = recvln(conn, buff, BUFFSIZE);		sscanf(buff, "%s %s %s", cmd, path, vers);		/* skip all headers - read until we get \r\n alone */		while((n = recvln(conn, buff, BUFFSIZE)) > 0) {			if (n == 2 && buff[0] == '\r' && buff[1] == '\n')				break;		}		/* check for unexpected end of file */		if (n &lt; 1) {			(void) send_eof(conn);			continue;		}				/* check for a request that we cannot understand */		if (strcmp(cmd, "GET") || (strcmp(vers, "HTTP/1.0") &&					   strcmp(vers, "HTTP/1.1"))) {			send_head(conn, 400, strlen(ERROR_400));			(void) send(conn, ERROR_400, strlen(ERROR_400),0);			(void) send_eof(conn);			continue;		}		/* send the requested web page or a "not found" error */		if (strcmp(path, "/") == 0) {			send_head(conn, 200, strlen(HOME_PAGE));			(void) send(conn, HOME_PAGE, strlen(HOME_PAGE),0);		} else if (strcmp(path, "/time") == 0) {#if defined(LINUX) || defined(SOLARIS)			gettimeofday(&tv, NULL);			timestr = ctime(&tv.tv_sec);#elif defined(WIN32)			time(&tv);			timestr = ctime(&tv);#endif			(void) sprintf(buff, TIME_PAGE, timestr);			send_head(conn, 200, strlen(buff));			(void) send(conn, buff, strlen(buff), 0);		} else { /* not found */			send_head(conn, 404, strlen(ERROR_404));			(void) send(conn, ERROR_404, strlen(ERROR_404),0);		}		(void) send_eof(conn);	}}/*----------------------------------------------------------------------- * send_head - send an HTTP 1.0 header with given status and content-len *----------------------------------------------------------------------- */voidsend_head(connection conn, int stat, int len){	char	*statstr, buff[BUFFSIZE];	/* convert the status code to a string */	switch(stat) {	case 200:		statstr = "OK";		break;	case 400:		statstr = "Bad Request";		break;	case 404:		statstr = "Not Found";		break;	default:		statstr = "Unknown";		break;	}		/*	 * send an HTTP/1.0 response with Server, Content-Length,	 * and Content-Type headers.	 */	(void) sprintf(buff, "HTTP/1.0 %d %s\r\n", stat, statstr);	(void) send(conn, buff, strlen(buff), 0);	(void) sprintf(buff, "Server: %s\r\n", SERVER_NAME);	(void) send(conn, buff, strlen(buff), 0);	(void) sprintf(buff, "Content-Length: %d\r\n", len);	(void) send(conn, buff, strlen(buff), 0);	(void) sprintf(buff, "Content-Type: text/html\r\n");	(void) send(conn, buff, strlen(buff), 0);	(void) sprintf(buff, "\r\n");	(void) send(conn, buff, strlen(buff), 0);}</pre></body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -