亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? httpd.c

?? c51版本的uip(一個超小型的TCPIP棧,支持tcpudparpicmp.
?? C
字號:
/*
 * Copyright (c) 2001, Adam Dunkels.
 * All rights reserved. 
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions 
 * are met: 
 * 1. Redistributions of source code must retain the above copyright 
 *    notice, this list of conditions and the following disclaimer. 
 * 2. Redistributions in binary form must reproduce the above copyright 
 *    notice, this list of conditions and the following disclaimer in the 
 *    documentation and/or other materials provided with the distribution. 
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *      This product includes software developed by Adam Dunkels.
 * 4. The name of the author may not be used to endorse or promote
 *    products derived from this software without specific prior
 *    written permission.  
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
 *
 * This file is part of the uIP TCP/IP stack.
 *
 * $Id: httpd.c,v 1.1.1.1 2003/04/15 02:11:56 qs Exp $
 *
 */

#include "uip.h"
#include "httpd.h"
#include "fs.h"
#include "fsdata.h"
#include "cgi.h"

#define NULL (void *)0

/* The HTTP server states: */
#define HTTP_NOGET        0
#define HTTP_FILE         1
#define HTTP_TEXT         2
#define HTTP_FUNC         3
#define HTTP_END          4

//#define DEBUG

#ifdef DEBUG
#include <stdio.h>
#define PRINT(x) printf("%s", x)
#define PRINTLN(x) printf("%s\n", x)
#else /* DEBUG */
#define PRINT(x)
#define PRINTLN(x)
#endif /* DEBUG */

struct httpd_state *hs;

extern code struct fsdata_file file_index_html;

static void next_scriptline(void);
static void next_scriptstate(void);

#define ISO_G        0x47
#define ISO_E        0x45
#define ISO_T        0x54
#define ISO_slash    0x2f    
#define ISO_c        0x63
#define ISO_g        0x67
#define ISO_i        0x69
#define ISO_space    0x20
#define ISO_nl       0x0a
#define ISO_cr       0x0d
#define ISO_a        0x61
#define ISO_t        0x74
#define ISO_hash     0x23
#define ISO_period   0x2e


/*-----------------------------------------------------------------------------------*/
void
httpd_init(void)
{
  fs_init();
  
  /* Listen to port 80. */
  uip_listen(80);
}
/*-----------------------------------------------------------------------------------*/
void
httpd(void)
{
	struct fs_file fsfile;  
	u8_t i;

	PRINTLN("httpd start ");
	switch(uip_conn->lport) 
	{
	/* This is the web server: */
	case htons(80):
		/* Pick out the application state from the uip_conn structure. */
		hs = (struct httpd_state *)(uip_conn->appstate);

		/* We use the uip_ test functions to deduce why we were
		   called. If uip_connected() is non-zero, we were called
		   because a remote host has connected to us. If
		   uip_newdata() is non-zero, we were called because the
		   remote host has sent us new data, and if uip_acked() is
		   non-zero, the remote host has acknowledged the data we
		   previously sent to it. */
		if(uip_connected()) 
		{
			/* Since we have just been connected with the remote host, we
			 reset the state for this connection. The ->count variable
			 contains the amount of data that is yet to be sent to the
			 remote host, and the ->state is set to HTTP_NOGET to signal
			 that we haven't received any HTTP GET request for this
			 connection yet. */
			hs->state = HTTP_NOGET;
			hs->count = 0;
			/* Don't send any data in return; we wait for the HTTP request
			instead. */
			uip_send(uip_appdata, 0);
			return;
		} else if(uip_poll()) 
		{
			/* If we are polled ten times, we abort the connection. This is
			 because we don't want connections lingering indefinately in
			 the system. */
			if(hs->count++ >= 10) 
			{
				uip_abort();
			}
			return;
		} else if(uip_newdata() && hs->state == HTTP_NOGET) 
		{
			/* This is the first data we receive, and it should contain a
				GET. */
		
			/* Check for GET. */
			if(uip_appdata[0] != ISO_G ||
			   uip_appdata[1] != ISO_E ||
			   uip_appdata[2] != ISO_T ||
			   uip_appdata[3] != ISO_space) 
			{
				/* If it isn't a GET, we abort the connection. */
				uip_abort();
				return;
			}
		   
			/* Find the file we are looking for. */
			for(i = 4; i < 40; ++i) 
			{
				if(uip_appdata[i] == ISO_space ||
					uip_appdata[i] == ISO_cr ||
					uip_appdata[i] == ISO_nl) 
				{
					uip_appdata[i] = 0;
					break;
				}
			}
		
			PRINT("request for file ");
			PRINTLN(&uip_appdata[4]);
			
			if(!fs_open((char *)&uip_appdata[4], &fsfile)) 
			{
				PRINTLN("couldn't open file");
				fs_open(file_index_html.name, &fsfile);
			} 
			
			if(uip_appdata[4] == ISO_slash &&
				uip_appdata[5] == ISO_c &&
				uip_appdata[6] == ISO_g &&
				uip_appdata[7] == ISO_i &&
				uip_appdata[8] == ISO_slash) 
			{
			/* If the request is for a file that starts with "/cgi/", we
				prepare for invoking a script. */	
				hs->script = fsfile.databuffer;
				next_scriptstate();
			} else 
			{
				hs->script = NULL;
				/* The web server is now no longer in the HTTP_NOGET state, but
				in the HTTP_FILE state since is has now got the GET from
				the client and will start transmitting the file. */
				hs->state = HTTP_FILE;
				
				/* Point the file pointers in the connection state to point to
				the first byte of the file. */
				hs->dataptr = fsfile.databuffer;
				hs->count = fsfile.len;	
			}     
		}

		if(hs->state != HTTP_FUNC) 
		{
		  /* Check if the client (remote end) has acknowledged any data that
		 we've previously sent. If so, we move the file pointer further
		 into the file and send back more data. If we are out of data to
		 send, we close the connection. */
			if(uip_acked()) 
			{
				if(hs->count >= uip_mss()) 
				{
					hs->count -= uip_mss();
					hs->dataptr += uip_mss();
				} else 
				{
					hs->count = 0;
				}
				
				if(hs->count == 0) 
				{
					if(hs->script != NULL) 
					{
						next_scriptline();
						next_scriptstate();
					} else 
					{
						uip_close();
					}
				}
			}         
		}

		if(hs->state == HTTP_FUNC) 
		{
			/* Call the CGI function. */
			if(cgitab[hs->script[2] - ISO_a]()) 
			{
			/* If the function returns non-zero, we jump to the next line
				in the script. */
				next_scriptline();
				next_scriptstate();
			}
		}

		if(hs->state != HTTP_FUNC && !uip_poll()) 
		{
			/* Send a piece of data, but not more than the MSS of the
			connection. */
			uip_send(hs->dataptr,
				hs->count > uip_mss()? uip_mss(): hs->count);
		}
		/* Finally, return to uIP. Our outgoing packet will soon be on its
			way... */
		return;

	default:
		/* Should never happen. */
		uip_abort();
		break;
	}  
}
/*-----------------------------------------------------------------------------------*/
/* next_scriptline():
 *
 * Reads the script until it finds a newline. */
static void
next_scriptline(void)
{
  /* Loop until we find a newline character. */
  do {
    ++(hs->script);
  } while(hs->script[0] != ISO_nl);

  /* Eat up the newline as well. */
  ++(hs->script);
}
/*-----------------------------------------------------------------------------------*/
/* next_sciptstate:
 *
 * Reads one line of script and decides what to do next.
 */
static void
next_scriptstate(void)
{
  struct fs_file fsfile;
  u8_t i;

 again:
  switch(hs->script[0]) {
  case ISO_t:
    /* Send a text string. */
    hs->state = HTTP_TEXT;
    hs->dataptr = &hs->script[2];

    /* Calculate length of string. */
    for(i = 0; hs->dataptr[i] != ISO_nl; ++i);
    hs->count = i;    
    break;
  case ISO_c:
    /* Call a function. */
    hs->state = HTTP_FUNC;
    hs->dataptr = NULL;
    hs->count = 0;
    uip_reset_acked();
    break;
  case ISO_i:   
    /* Include a file. */
    hs->state = HTTP_FILE;
    if(!fs_open(&hs->script[2], &fsfile)) {
      uip_abort();
    }
    hs->dataptr = fsfile.databuffer;
    hs->count = fsfile.len;
    break;
  case ISO_hash:
    /* Comment line. */
    next_scriptline();
    goto again;
    break;
  case ISO_period:
    /* End of script. */
    hs->state = HTTP_END;
    uip_close();
    break;
  default:
    uip_abort();
    break;
  }
}
/*-----------------------------------------------------------------------------------*/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产日韩三级在线| 欧美吞精做爰啪啪高潮| 美女视频网站久久| 日韩综合小视频| 亚洲成人7777| 日韩高清不卡在线| 免费成人在线视频观看| 视频一区二区不卡| 久久精品噜噜噜成人88aⅴ| 蜜臀99久久精品久久久久久软件 | 国产日韩成人精品| 国产欧美一区二区精品秋霞影院| 久久久久国产成人精品亚洲午夜| 国产偷国产偷亚洲高清人白洁| 久久嫩草精品久久久久| 亚洲国产精品v| 亚洲老司机在线| 日日夜夜精品视频免费| 国产一区亚洲一区| fc2成人免费人成在线观看播放 | 国产91露脸合集magnet| 国产成人亚洲综合a∨婷婷图片| 成人永久aaa| 色综合中文字幕国产 | 欧美视频一区二区三区| 91精品蜜臀在线一区尤物| 久久青草欧美一区二区三区| 亚洲欧美综合在线精品| 日韩av高清在线观看| 国产成人免费高清| 欧美美女直播网站| 欧美韩国日本综合| 亚洲不卡在线观看| 成人av在线资源| 5566中文字幕一区二区电影| 国产区在线观看成人精品| 亚洲一区二区三区在线看| 狠狠色狠狠色合久久伊人| 色综合天天综合在线视频| 欧美电影免费提供在线观看| 亚洲国产一区二区在线播放| 蜜桃在线一区二区三区| 99re热视频这里只精品| 久久综合狠狠综合久久综合88 | 日韩电影在线观看网站| 国产一区二区三区四区五区美女 | 久久综合色一综合色88| 亚洲精品一二三| 国产成人亚洲综合a∨婷婷| 51精品视频一区二区三区| 亚洲少妇屁股交4| 国产一区二区三区电影在线观看| 91黄色激情网站| 国产精品你懂的在线欣赏| 麻豆精品一区二区av白丝在线| 91国偷自产一区二区三区观看 | 久久这里只有精品6| 亚洲r级在线视频| 一本久道久久综合中文字幕| 中文字幕免费不卡| 国产一区二区网址| 欧美一区二区三区在线观看| 亚洲成av人片在线| 欧美日韩中文字幕一区| 一个色妞综合视频在线观看| 99国产精品久久久久久久久久久| 久久综合狠狠综合| 国产乱对白刺激视频不卡| 日韩欧美激情四射| 日韩av电影天堂| 91精品国产欧美日韩| 日韩精品三区四区| 欧美一区二区三区四区在线观看| 亚洲影视资源网| 欧美亚洲日本国产| 亚洲福利视频一区| 欧美日韩国产综合一区二区| 亚洲午夜精品在线| 欧美一区二区在线视频| 秋霞影院一区二区| 精品国产亚洲在线| 夫妻av一区二区| 欧美激情中文不卡| eeuss鲁一区二区三区| 亚洲精品免费播放| 欧美日韩国产成人在线91| 视频一区二区三区中文字幕| 日韩欧美国产小视频| 国产一区亚洲一区| 亚洲天堂精品在线观看| 欧美日韩在线播放三区| 日韩电影在线免费| 国产亚洲欧美激情| 色天使久久综合网天天| 五月天网站亚洲| 久久久久久亚洲综合| 色综合天天综合网国产成人综合天 | 看片的网站亚洲| 中文无字幕一区二区三区| 色综合久久综合网欧美综合网| 亚洲综合一区在线| 精品久久久久久综合日本欧美| 成人手机在线视频| 日韩精品91亚洲二区在线观看| 久久久久成人黄色影片| 欧美在线色视频| 国产一区二区三区观看| 夜夜亚洲天天久久| 精品国产一区二区三区av性色 | 久久精品一区二区三区av| 一本色道久久综合亚洲91| 日本不卡中文字幕| 最新欧美精品一区二区三区| 日韩一区二区电影| 91浏览器在线视频| 韩国精品在线观看| 亚洲成人激情自拍| 亚洲视频免费观看| 久久综合99re88久久爱| 欧美影院一区二区三区| 国产+成+人+亚洲欧洲自线| 天堂va蜜桃一区二区三区 | 555夜色666亚洲国产免| 99精品视频在线观看免费| 美日韩一区二区三区| 亚洲欧美日韩国产中文在线| 久久久亚洲综合| 欧美情侣在线播放| 91色在线porny| 成人一级黄色片| 国产一区不卡精品| 久久狠狠亚洲综合| 日韩电影一区二区三区四区| 亚洲黄色性网站| 日韩理论片中文av| 国产日韩av一区| 国产亚洲污的网站| 久久久精品国产99久久精品芒果| 日韩一级片在线观看| 欧美三级电影网站| 欧美日韩小视频| 欧美午夜一区二区三区免费大片| 波多野洁衣一区| 国产福利91精品| 国产成a人亚洲| 国产宾馆实践打屁股91| 国产一区二区影院| 国产露脸91国语对白| 国产成人免费9x9x人网站视频| 黄页网站大全一区二区| 国模套图日韩精品一区二区| 久久电影网电视剧免费观看| 免费成人美女在线观看.| 日韩av高清在线观看| 免费欧美在线视频| 精品一区二区在线免费观看| 久久99国产精品免费网站| 美国毛片一区二区三区| 久久er99热精品一区二区| 国精产品一区一区三区mba桃花| 久久www免费人成看片高清| 国产一区二区视频在线| 成人精品免费看| 在线精品视频免费播放| 欧美日韩国产美| 91精品国产一区二区三区香蕉| 日韩免费一区二区| 国产亚洲欧美色| 亚洲欧美国产77777| 日一区二区三区| 国产精品系列在线播放| 一本大道久久a久久精品综合| 欧美日韩一区三区| 日韩欧美在线1卡| 国产蜜臀av在线一区二区三区| 亚洲欧洲精品一区二区三区不卡| 亚洲综合色噜噜狠狠| 麻豆91精品视频| 国产99久久久精品| 欧美视频在线一区二区三区 | 国产精品成人在线观看| 亚洲国产wwwccc36天堂| 欧美aa在线视频| av爱爱亚洲一区| 日韩一区二区视频| 中文字幕日韩欧美一区二区三区| 亚洲福利电影网| 国产成人高清在线| 欧美日韩精品一区二区天天拍小说 | 韩国成人在线视频| 91精品1区2区| 精品捆绑美女sm三区| 一区二区三区精品视频在线| 激情久久五月天| 91福利国产精品| 国产欧美一区二区精品久导航 | 亚洲bt欧美bt精品| 成人小视频在线| 亚洲精品一线二线三线| 五月天激情综合|