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

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

?? webserve.c

?? 開源的嵌入式WEB服務器
?? C
字號:
/* Web Server for 'TCP/IP Lean' (c) Iosoft Ltd. 2000

This software is only licensed for distribution with the book 'TCP/IP Lean',
and may only be used for personal experimentation by the purchaser
of that book, on condition that this copyright notice is retained.
For commercial licensing, contact license@iosoft.co.uk

This is experimental software; use it entirely at your own risk. The author
offers no warranties of any kind, including its fitness for purpose. */

/*
** v0.01 JPB 20/3/00  Derived from Telnet v0.12
** v0.02 JPB 23/3/00  Used function upcall ptrs in TCP.C and IP.C
** v0.03 JPB 11/4/00  Added HTTP header type selection
** v0.04 JPB 12/4/00  Added clickable HTML directory
** v0.05 JPB 13/4/00  Added state machine to handle large directories
** v0.06 JPB 15/4/00  Return directory only if null filename
**                    Return error response if file not found
** v0.07 JPB 3/7/00   Changed default config file to TCPLEAN.CFG
**                    Revised header for book CD
*/

#define VERSION "0.07"

/* HTTP response header: 0=none, 1=simple OK, 2=content-type */
#define HTTP_HEAD 2
/* Directory type: 0=text, 1=simple HTML, 2=table, 3=large dir support */
#define HTML_DIR 3

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <time.h>
#include <stdarg.h>

#include "ether.h"
#include "netutil.h"
#include "net.h"
#include "ip.h"
#include "tcp.h"
#include "uart.h"
#include "fs.h"
#include "timer.h"
#define HTTP_OK     "HTTP/1.1 200 OK\r\n"
#define HTTP_NOFILE "HTTP/1.1 404 Not found\r\n"
#define HTTP_HTM    "Content-type: text/html\r\n"
#define HTTP_TXT    "Content-type: text/plain\r\n"
#define HTTP_GIF    "Content-type: image/gif\r\n"
#define HTTP_XBM    "Content-type: image/x-xbitmap\r\n"
#define HTTP_JAVA   "Content-type: application/java\r\n"
#define HTTP_CLOSE  "Connection: close\r\n" 
  
#define HTTP_BLANK  "\r\n"
#define HTTP_MAXLEN 80

GENFRAME genframe;                  /* Frame for network Tx/Rx */
extern BYTE bcast[MACLEN];          /* Broadcast Ethernet addr */
NODE  locnode;                      /* My Ethernet and IP addresses */
int breakflag;                      /* Flag to indicate ctrl-break pressed */
char httpreq[HTTP_MAXLEN+1];        /* Buffer for first part of HTTP request */

/* Debug flags */
extern int netdebug;                /* Verbose packet display */
extern int tcpdebug;                /* TCP frame display */
extern int statedebug;              /* TCP state display */
int webdebug;                       /* Web (HTTP) diagnostic display */
extern LWORD ticks;
extern TIME tm0;
extern DATA_FILE *FS_ROOT;
/* Socket storage */
#define NSOCKS 5
TSOCK tsocks[NSOCKS] =              /* Initialise index num and buffer sizes */
{
    {1,{_CBUFFLEN_},{_CBUFFLEN_}},
    {2,{_CBUFFLEN_},{_CBUFFLEN_}},
    {3,{_CBUFFLEN_},{_CBUFFLEN_}},
    {4,{_CBUFFLEN_},{_CBUFFLEN_}},
    {5,{_CBUFFLEN_},{_CBUFFLEN_}},
};

/* Application-specific storage */
typedef struct {
    DATA_FILE *in;
    long count;                     /* State variable/counter */
} APPDATA;
APPDATA appdata[NSOCKS];

/* Function pointers: upcalls from TCP/IP stack */
extern NODE *(*get_locnode_n)(int n);                   /* Get local node */
extern int (*server_upcall)(TSOCK *ts, CONN_STATE conn);/* TCP server action */
extern volatile char MyMacSrcAddr[6] ;
/* Prototypes */
WORD read_netconfig(char *fname, NODE *np);
NODE *locnode_n(int n);
int server_action(TSOCK *ts, CONN_STATE conn);
int tcp_echo(TSOCK *ts, CONN_STATE conn);
void http_get(TSOCK *ts, char *fname);
void http_data(TSOCK *ts,CONN_STATE conn);
int dir_head(CBUFF *bp, char *path);
int dir_entry(CBUFF *bp, char *name);
int dir_tail(CBUFF *bp);
void do_receive(GENFRAME *gfp);
void do_poll(GENFRAME *gfp);
int buff_inprintf(CBUFF *bp, char *str, ...);
void disp_usage(void);
void break_handler(int sig);

void  web_test()
{
  int i;
  char temps[18];
  GENFRAME *gfp;
  LWORD time;   // LWORD mstimer;
  locnode.dtype=0; //以太網
  for(i=0;i<MACLEN;i++)
     locnode.mac[i]=MyMacSrcAddr[i];
  locnode.ip=10;  //ip 10.11.112.5
  locnode.ip=(locnode.ip<<8)+11;
  locnode.ip=(locnode.ip<<8)+112;
  locnode.ip=(locnode.ip<<8)+5;
  locnode.mask=255;   //mask 255.255.255.0
  locnode.mask=(locnode.mask<<8)+255;
  locnode.mask=(locnode.mask<<8)+255; 
  locnode.mask=(locnode.mask<<8)+255;
  locnode.mask=(locnode.mask<<8)+0;
  locnode.gate=10;  //gate 10.11.112.1
  locnode.gate=(locnode.gate<<8)+11;
  locnode.gate=(locnode.gate<<8)+112;
  locnode.gate=(locnode.gate<<8)+1;
  printf("Ready for WEBSERVE \n");          /* Sign on */
  printf("Please send email to bookworm01@sohu.com,if you have any problem.\n");
  printf("Ren Daqian\n");
  printf("the department of mechanical engineering\n");
  printf("Zhejiang University.\n");  
  genframe.g.dtype =locnode.dtype;               /* Set frame driver type */
  gfp = &genframe;                        /* Get pointer to frame */
  printf("IP %s", ipstr(locnode.ip, temps));
  printf(" mask %s", ipstr(locnode.mask, temps));
  if (locnode.gate)
      printf(" gate %s", ipstr(locnode.gate, temps));
  if (locnode.dtype & DTYPE_ETHER)
      printf(" Ethernet %s", ethstr(locnode.mac, temps));
  for (i=0; i<NSOCKS; i++)              //初始化socket
       tsocks[i].app = &appdata[i]; 
   get_locnode_n = locnode_n;                  /* Set upcall func ptrs */
   server_upcall = server_action;
   
   statedebug =0;//1;                              /*  display TCP states */
   tcpdebug = 0;//1;                                /* display TCP segments */
   netdebug |= 1;                  /*  verbose packet display */
   webdebug = 1;            /*  Web (HTTP) diagnostics */
   netdebug |= 2;                  /* hex packet display */
   netdebug =0;
   mstimeout(&time,0);//記錄當前時間
    while (1)           /* Main loop.. */
        {
            do_receive(gfp);                    /* Receive frames */
            do_poll(gfp);                       /* Poll net drivers */
            if(mstimeout(&time,5000)) 
               printf("\ncurrent time is %d:%d:%d.%d", tm0.tm_hour,tm0.tm_min,
                      tm0.tm_sec,tm0.tm_millisec);
            
        }
       
  
    
}



/* Return ptr to local node 'n' (n=0 for first), return 0 if doesn't exist
** Used by IP functions to get my netmask & gateway addresses */
NODE *locnode_n(int n)
{
    return(n==0 ? &locnode : 0);
}

/* Upcall from TCP stack to server when opening, connecting, receiving data
** or closing. Return 0 to prevent connection opening, or close if connected */
int server_action(TSOCK *ts, CONN_STATE conn)
{
    int ok=1, len;
    WORD port;
    char *s, *name;
    APPDATA *adp;

    port = ts->loc.port;
    adp = (APPDATA *)ts->app;
    if (port != HTTPORT)
        ok = 0;
    else if (conn == TCP_OPEN)
    {
        adp->in = 0;
    }
    else if (conn == TCP_DATA)
    {
        if ((len = buff_chrlen(&ts->rxb, '\n'))!=0) /* Got request? */
        {
            len = mini(len+1, HTTP_MAXLEN);         /* Truncate length */
            buff_out(&ts->rxb, (BYTE *)httpreq, (WORD)len);
            httpreq[len] = 0;
            if (webdebug)                           /* Display if debugging */
                printf("%s", httpreq);
            s = strtok(httpreq, " ");               /* Chop into tokens */
            if (!strcmp(s, "GET"))                  /* 1st token is 'GET'? */
            {
                name = strtok(0, " ?\r\n");         /* 2nd token is filename */
                http_get(ts, name);                 /* Process filename */
            }
        }
    }
    http_data(ts,conn);
    return(ok);
}


/* Process the filepath from an HTTP 'get' method */
void http_get(TSOCK *ts, char *fname)
{
    APPDATA *adp;
    char *s=0;
    DATA_FILE * fp;
    adp = (APPDATA *)ts->app;
    adp->count =0;
    if((fname[0]=='/')&&(fname[1]==NULL))  //GET /  返回目錄
      { int i=0;
        char * str; 
        buff_instr(&ts->txb, HTTP_OK);
        buff_inprintf(&ts->txb,HTTP_CLOSE);
        buff_inprintf(&ts->txb,HTTP_BLANK);
        i=buff_instr(&ts->txb, "<html><head><title>Directory</title></head><body>\r\n");
        for(fp = FS_ROOT; fp != NULL; fp = (DATA_FILE*)fp->next)
           { str =fp->name;
             i=i+buff_inprintf(&ts->txb,"<p><a href=\42%s\42> %s</a>\r\n",str,str);
           }
        i=i+buff_inprintf(&ts->txb,"</body></html>\r\n");
        buff_inprintf(&ts->txb,HTTP_BLANK);   
        close_tcp(ts);   //關閉tcp連接
        return;   
      }     
    adp->in=fs_open(fname);
    if(adp->in !=NULL)           //找到文件
      {adp->count =(adp->in)->len;
       buff_instr(&ts->txb, HTTP_OK);
       s=strchr(fname,'.');  //得到文件的擴展名
       if ((!strcmp(s, ".html"))||(!strcmp(s, ".htm")))//超文本
          buff_instr(&ts->txb,HTTP_HTM);
       else if(!strcmp(s, ".class"))
          buff_instr(&ts->txb,HTTP_JAVA);    
       buff_inprintf(&ts->txb, "Content-Length : %d \r\n",adp->count);
       buff_inprintf(&ts->txb,HTTP_CLOSE);
       buff_inprintf(&ts->txb,HTTP_BLANK);
       
       
      } 
    else   //找不到文件
      { 
        buff_instr(&ts->txb, HTTP_NOFILE);
        buff_inprintf(&ts->txb,HTTP_CLOSE);
        buff_inprintf(&ts->txb,HTTP_BLANK);
        close_tcp(ts);   //關閉tcp連接
       }
    
  
}

/* If there is space in the transmit buffer, send HTTP data */
void http_data(TSOCK *ts,CONN_STATE conn)
{
    APPDATA *adp;
    DATA_FILE *file;
    int len;
   
    adp = (APPDATA *)ts->app;
    if((adp->in)&&((adp->count)>0)) //如果有數據需要傳送                     
         {file =adp->in;
          len=buff_in(&(ts->txb),&(file->data[file->len-(adp->count)]),adp->count); 
                         //將文件塞進緩沖區
          adp->count -=len;
          if(adp->count <=0)
            close_tcp(ts);   //關閉tcp連接
          
          if(tcpdebug)
              {printf("Put Tx data in socket(%d) %d -> %d\n",
                   ts->index, ts->loc.port,ts->rem.port);
               printf("%d bytes sent and remain %d bytes.\n",len,adp->count);
                              
              }                
         }
    else
      { adp->in=NULL;
        adp->count =0;
      }
       
}


/* Write out head of HTML file dir, given filepath. Return 0 if error */
int dir_head(CBUFF *bp, char *path)
{
#if HTML_DIR > 1
    return(buff_instr(bp, HTTP_OK HTTP_HTM HTTP_BLANK) &&
           buff_instr(bp, "<html><head><title>Directory</title></head>\r\n") &&
           buff_inprintf(bp, "<body><h2>Directory of %s</h2>\r\n", path) &&
           buff_instr(bp, "<table><th>File</th><th>Size</th>\r\n"));
#else
    return(buff_instr(bp, HTTP_OK HTTP_HTM HTTP_BLANK) &&
           buff_instr(bp, "<html><head><title>Directory</title></head>\r\n") &&
           buff_inprintf(bp, "<body><h2>Directory of %s</h2>\r\n", path));
#endif
}



/* Write out tail of HTML file dir. Return length, 0 if error */
int dir_tail(CBUFF *bp)
{
#if HTML_DIR > 1
    return(buff_instr(bp, "</table></body></html>\r\n"));
#else
    return(buff_instr(bp, "</body></html>\r\n"));
#endif
}

/* Check for incoming packets, send response if required */
void do_receive(GENFRAME *gfp)
{
    NODE node;
    ARPKT *arp;
    IPKT *ip;
    ICMPKT *icmp;
    int rxlen, txlen, len;

    if ((rxlen=get_frame(gfp)) > 0)                 /* Any incoming frames? */
    {   
        if(netdebug)   
          disp_frame(gfp, rxlen, 0); //顯示數據包    
        ip = getframe_datap(gfp);
        if (is_arp(gfp, rxlen))
        {                                           /* ARP response? */
            arp = getframe_datap(gfp);
            swap_arp(gfp);
            if (arp->op==ARPREQ && arp->dip==locnode.ip)
            {                                       /* ARP request? */
                node.ip = arp->sip;                 /* Make ARP response */
                memcpy(node.mac, arp->smac, MACLEN);
                txlen = make_arp(gfp, &locnode, &node, ARPRESP);
                put_frame(gfp, txlen);              /* Send packet */
                if(netdebug)   
                   disp_frame(gfp, txlen, 1); //顯示數據包  
            }
            if (arp->op==ARPRESP && arp->dip==locnode.ip)
            {                                       /* ARP response? */
                arp_receive(tsocks, NSOCKS, gfp);
            }
         return;   
        }
        rxlen=is_ip(gfp, rxlen);
        if ((rxlen!=0) &&    /* IP datagram? */
                 ip->i.dip==locnode.ip || ip->i.dip==BCASTIP)
        {
            getip_srce(gfp, &node);
            if ((len=is_icmp(ip, rxlen))!=0)        /* ICMP? */
            {
                icmp = (ICMPKT *)ip;
                if (icmp->c.type==ICREQ)            /* Echo request? */
                {
                    len = (WORD)maxi(len, 0);       /* Make response */
                    txlen = make_icmp(gfp, &locnode, &node, ICREP,
                                      icmp->c.code, (WORD)len);
                    put_frame(gfp, txlen);          /* Send packet */
                    if(netdebug)   
                      disp_frame(gfp, txlen, 1); //顯示數據包 
                }
            }
            else if ((len=is_tcp(ip, rxlen))!=0)    /* TCP? */
            {   
               tcp_receive(tsocks, NSOCKS, gfp, len);
            }
        }
    }
}

/* Poll the network interface to keep it alive */
void do_poll(GENFRAME *gfp)
{
    tcp_poll(tsocks, NSOCKS, gfp);
   
   
}

/* Version of printf() to write a string into a circular buffer.
** Return string length, or zero if insufficient room in buffer */
int buff_inprintf(CBUFF *bp, char *str, ...)
{
    char temps[200];
    int len;

    va_list argptr;
    va_start(argptr, str);
    len = vsprintf(temps, str, argptr);
    va_end(argptr);
    if (len<=0 || len>buff_freelen(bp))
        len = 0;
    else
        buff_in(bp, (BYTE *)temps, (WORD)len);
    return(len);
}

/* Display usage help */


/* Ctrl-break handler: set flag and return */
void break_handler(int sig)
{
    breakflag = sig;
}

/* EOF */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产日韩欧美制服另类| 91美女片黄在线观看91美女| 精品免费日韩av| 精品一区二区三区影院在线午夜| 精品国产一区久久| 国产一区二区h| 国产精品三级av| 欧美综合色免费| 青青草91视频| 亚洲国产成人在线| 91精彩视频在线| 日韩高清不卡在线| 久久久电影一区二区三区| 不卡av免费在线观看| 一区二区三区精密机械公司| 3d成人动漫网站| 国产精品综合视频| 亚洲女厕所小便bbb| 欧美一区二区三区四区久久| 国产精品91xxx| 一区二区在线观看免费视频播放| 欧美男男青年gay1069videost| 久久99国产精品尤物| 国产精品久久久久久久久晋中| 欧美视频完全免费看| 国产一区美女在线| 一区二区三区精品久久久| 日韩一区二区电影网| www.日韩精品| 国产传媒一区在线| 亚洲综合在线视频| 久久夜色精品一区| 欧美日韩中字一区| 国产大片一区二区| 肉肉av福利一精品导航| 国产欧美日韩在线| 日韩午夜小视频| 色www精品视频在线观看| 久久99国产精品久久99果冻传媒| 亚洲欧美激情在线| 国产亚洲精品精华液| 欧美日韩国产乱码电影| av资源站一区| 国产一区二区三区最好精华液| 午夜日韩在线电影| 亚洲欧美日韩在线| 欧美极品xxx| 欧美变态口味重另类| 在线中文字幕一区二区| 国产成人av一区二区| 欧美a一区二区| 亚洲主播在线播放| 国产精品成人网| 欧美精品一区二区三区久久久| 欧美在线观看18| 99精品视频在线观看免费| 国产一区二区美女诱惑| 日韩经典一区二区| 亚洲国产精品欧美一二99| 国产精品毛片大码女人| 欧美精品一区二区三区蜜桃 | 日韩在线a电影| 亚洲欧美日韩系列| 亚洲欧洲三级电影| 日本一区二区电影| 久久美女艺术照精彩视频福利播放| 欧美精品亚洲一区二区在线播放| 99久久久久久| av影院午夜一区| 成人综合激情网| 国产成人在线色| 国产成人av一区二区三区在线观看| 麻豆91免费看| 久久99蜜桃精品| 激情欧美一区二区三区在线观看| 日本大胆欧美人术艺术动态| 日本午夜精品视频在线观看| 欧美a级理论片| 国产曰批免费观看久久久| 狠狠色丁香久久婷婷综| 狠狠色狠狠色综合系列| 国产一区二区三区四| 成人污污视频在线观看| eeuss鲁片一区二区三区在线看 | a亚洲天堂av| 欧美欧美欧美欧美| 91麻豆精品久久久久蜜臀| 日韩一区二区三区在线| 精品国产免费久久| 久久精品一区二区三区不卡牛牛| 久久精品在线观看| 亚洲欧美一区二区三区孕妇| 亚洲电影视频在线| 免费成人在线视频观看| 精品在线免费视频| 高清不卡一二三区| 91一区二区三区在线播放| 一本色道**综合亚洲精品蜜桃冫 | www.成人网.com| 91福利资源站| 欧美一级电影网站| 国产日韩欧美精品电影三级在线| 国产精品青草久久| 亚洲午夜久久久久久久久久久| 青青青伊人色综合久久| 成人免费视频app| 欧美日韩一区二区三区视频| 久久嫩草精品久久久久| 亚洲狼人国产精品| 另类的小说在线视频另类成人小视频在线 | 精品国产乱码久久久久久浪潮| 国产日韩欧美高清在线| 一区二区三区日韩| 国产精品一区二区黑丝| 欧美亚洲国产一区二区三区va | 亚洲午夜视频在线观看| 国产精品久久久久久久午夜片| 国产精品二三区| 日韩高清在线一区| av日韩在线网站| 51久久夜色精品国产麻豆| 国产精品免费av| 午夜精品在线看| 国产福利一区二区| 欧美一区二区三区人| 国产精品乱人伦一区二区| 日本麻豆一区二区三区视频| 99久久国产综合精品色伊| 欧美肥妇毛茸茸| 国产精品伦一区二区三级视频| 日本午夜一本久久久综合| 一本色道久久加勒比精品| 久久久亚洲国产美女国产盗摄 | 欧美无乱码久久久免费午夜一区| 欧美精品一区二| 婷婷综合久久一区二区三区| 99热在这里有精品免费| 精品国产网站在线观看| 亚洲成在人线在线播放| 99精品国产一区二区三区不卡| 日韩精品一区二| 首页亚洲欧美制服丝腿| 91在线观看成人| 国产日韩欧美不卡| 久久福利资源站| 欧美二区乱c少妇| 亚洲国产日韩精品| 色偷偷88欧美精品久久久| 中文字幕精品三区| 国产高清不卡一区二区| 日韩精品一区二区三区老鸭窝| 丝瓜av网站精品一区二区| 在线观看日韩国产| 一区二区三区在线免费| 99久久婷婷国产综合精品电影 | 欧美xxxxx裸体时装秀| 亚洲国产精品一区二区www | 《视频一区视频二区| 国产ts人妖一区二区| 精品电影一区二区| 蜜桃av一区二区三区| 欧美一区在线视频| 蜜桃av噜噜一区| 日韩欧美第一区| 免费看欧美女人艹b| 5566中文字幕一区二区电影| 亚洲成va人在线观看| 欧美另类z0zxhd电影| 日韩中文字幕av电影| 7777精品伊人久久久大香线蕉超级流畅 | av中文一区二区三区| 中文字幕日韩精品一区| 成人免费三级在线| 亚洲欧美在线aaa| 91年精品国产| 一区二区三区在线视频免费观看| 一本久道久久综合中文字幕| 亚洲免费电影在线| 欧美女孩性生活视频| 美腿丝袜在线亚洲一区| 久久久久久久久久久99999| 国产成人av影院| 成人免费一区二区三区在线观看| 99天天综合性| 一级特黄大欧美久久久| 欧美日韩国产一级片| 日本vs亚洲vs韩国一区三区二区| 欧美一区二区私人影院日本| 激情偷乱视频一区二区三区| 国产情人综合久久777777| 99精品久久免费看蜜臀剧情介绍| 一区二区日韩电影| 日韩三级中文字幕| 国产激情一区二区三区四区| 中文字幕一区二区5566日韩| 在线免费精品视频| 久久精品免费观看| 国产精品久久久久7777按摩| 欧美日韩免费电影| 国产精品性做久久久久久|