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

📄 webdemo.c

📁 含有完整TCP/IP PPP协议的嵌入式操作系统
💻 C
字号:
#include <stdio.h>#include <string.h>#include <dev/nicrtl.h>#include <dev/lanc111.h>#include <dev/urom.h>#include <sys/timer.h>#include <sys/thread.h>#include <sys/confnet.h>#include <sys/socket.h>#include <arpa/inet.h>#include <net/route.h>#include <pro/httpd.h>#include <pro/dhcp.h>#include <sys/atom.h>#include "basemon.h"#include "webdemo.h"static char *states[] = { "TRM",    "<FONT COLOR=#CC0000>RUN</FONT>",    "<FONT COLOR=#339966>RDY</FONT>",    "SLP"};/* * Thread list CGI. */static int ShowThreads(FILE * stream, REQUEST * req){    NUTTHREADINFO *tdp = nutThreadList;    static prog_char head_P[] = "<HTML><HEAD><TITLE>Nut/OS Threads</TITLE>" "</HEAD><BODY><h1>Nut/OS Threads</h1>\r\n";    static prog_char ttop_P[] = "<TABLE BORDER><TR><TH>Handle</TH>"        "<TH>Name</TH><TH>Priority</TH>"        "<TH>Status</TH><TH>Event<BR>Queue</TH>" "<TH>Timer</TH><TH>Stack-<BR>pointer</TH>" "<TH>Free<BR>Stack</TH></TR>\r\n";    static prog_char tbot_P[] = "</TABLE></BODY></HTML>";    static prog_char tfmt_P[] = "<TR><TD>%04X</TD><TD>%s</TD><TD>%u</TD>"        "<TD>%s</TD><TD>%04X</TD><TD>%04X</TD>" "<TD>%04X</TD><TD>%u</TD><TD>%s</TD></TR>\r\n";    NutHttpSendHeaderTop(stream, req, 200, "Ok");    NutHttpSendHeaderBot(stream, "text/html", -1);    fputs_P(head_P, stream);    fputs_P(ttop_P, stream);    while (tdp) {        fprintf_P(stream, tfmt_P, tdp, tdp->td_name, tdp->td_priority,                  states[tdp->td_state], tdp->td_queue, tdp->td_timer,                  tdp->td_sp,                  (uptr_t) tdp->td_sp - (uptr_t) tdp->td_memory, *((u_long *) tdp->td_memory) != DEADBEEF ? "Corr" : "OK");        tdp = tdp->td_next;    }    fputs_P(tbot_P, stream);    fflush(stream);    return 0;}/* * Timer list CGI. */static int ShowTimer(FILE * stream, REQUEST * req){    NUTTIMERINFO *tnp;    u_long ticks_left;    u_long crystal;    static prog_char head_P[] = "<HTML><HEAD><TITLE>Nut/OS Timers</TITLE>" "</HEAD><BODY>";    static prog_char cfmt_P[] = "\r\nCPU running at %u.%04u MHz<br>\r\n";    static prog_char ttop_P[] = "<TABLE BORDER><TR><TH>Handle</TH>"        "<TH>Countdown</TH><TH>Tick Reload</TH>" "<TH>Callback<BR>Address</TH>" "<TH>Callback<BR>Argument</TH></TR>\r\n";    static prog_char tfmt_P[] = "<TR><TD>%04X</TD><TD>%lu</TD><TD>%lu</TD>" "<TD>%04X</TD><TD>%04X</TD></TR>\r\n";    static prog_char tbot_P[] = "</TABLE></BODY></HTML>";    NutHttpSendHeaderTop(stream, req, 200, "Ok");    NutHttpSendHeaderBot(stream, "text/html", -1);    fputs_P(head_P, stream);    crystal = NutGetCpuClock();    fprintf_P(stream, cfmt_P, (int) (crystal / 1000000UL), (int) ((crystal - (crystal / 1000000UL) * 1000000UL) / 100));    if ((tnp = nutTimerList) != 0) {        fputs_P(ttop_P, stream);        ticks_left = 0;        while (tnp) {            ticks_left += tnp->tn_ticks_left;            fprintf_P(stream, tfmt_P, tnp, ticks_left, tnp->tn_ticks, tnp->tn_callback, tnp->tn_arg);            tnp = tnp->tn_next;        }    }    fputs_P(tbot_P, stream);    fflush(stream);    return 0;}/* * Socket list CGI. */static int ShowSockets(FILE * stream, REQUEST * req){    extern TCPSOCKET *tcpSocketList;    TCPSOCKET *ts;    static prog_char head_P[] = "<HTML><HEAD><TITLE>Show Threads</TITLE>"        "</HEAD><BODY><TABLE BORDER><TR>" "<TH>Handle</TH><TH>Type</TH><TH>Local</TH>" "<TH>Remote</TH><TH>Status</TH></TR>\r\n";    static prog_char fmt1_P[] = "<TR><TD>%04X</TD><TD>TCP</TD><TD>%s:%u</TD>";    static prog_char fmt2_P[] = "<TD>%s:%u</TD><TD>";    static prog_char estb_P[] = "<FONT COLOR=#CC0000>ESTABL</FONT>";    static prog_char tbot_P[] = "</TABLE></BODY></HTML>\r\n";    NutHttpSendHeaderTop(stream, req, 200, "Ok");    NutHttpSendHeaderBot(stream, "text/html", -1);    fputs_P(head_P, stream);    NutEnterCritical();    for (ts = tcpSocketList; ts; ts = ts->so_next) {        fprintf_P(stream, fmt1_P, ts, inet_ntoa(ts->so_local_addr), ntohs(ts->so_local_port));        fprintf_P(stream, fmt2_P, inet_ntoa(ts->so_remote_addr), ntohs(ts->so_remote_port));        switch (ts->so_state) {        case TCPS_LISTEN:            fputs("LISTEN", stream);            break;        case TCPS_SYN_SENT:            fputs("SYNSENT", stream);            break;        case TCPS_SYN_RECEIVED:            fputs("SYNRCVD", stream);            break;        case TCPS_ESTABLISHED:            fputs_P(estb_P, stream);            break;        case TCPS_FIN_WAIT_1:            fputs("FINWAIT1", stream);            break;        case TCPS_FIN_WAIT_2:            fputs("FINWAIT2", stream);            break;        case TCPS_CLOSE_WAIT:            fputs("CLOSEWAIT", stream);            break;        case TCPS_CLOSING:            fputs("CLOSING", stream);            break;        case TCPS_LAST_ACK:            fputs("LASTACK", stream);            break;        case TCPS_TIME_WAIT:            fputs("TIMEWAIT", stream);            break;        case TCPS_CLOSED:            fputs("CLOSED", stream);            break;        default:            fputs("?UNK?", stream);            break;        }        fputs("</TD></TR>\r\n", stream);    }    NutExitCritical();    fputs_P(tbot_P, stream);    fflush(stream);    return 0;}void DoCheckboxes(FILE * stream, u_char * name, u_char val){    u_char i;    static prog_char ttop_P[] = "<tr><td>%s</td>";    static prog_char tfmt_P[] = "<td><input type=\"checkbox\"" " name=\"%s\" value=\"%u\" ";    static prog_char tchk_P[] = " checked=\"checked\"";    fprintf_P(stream, ttop_P, name);    for (i = 8; i-- > 0;) {        fprintf_P(stream, tfmt_P, name, i);        if (val & BV(i))            fputs_P(tchk_P, stream);        fputs("></td>\r\n", stream);    }    fputs("</tr>\r\n", stream);}/* * Socket list CGI. */static int ShowPorts(FILE * stream, REQUEST * req){    static prog_char ttop_P[] = "<HTML><HEAD><TITLE>Show Ports</TITLE>"        "</HEAD><BODY>"        "<form action=\"cgi-bin/setports.cgi\" "        "enctype=\"text/plain\"> <TABLE BORDER>"        "<tr><td>Bit</td><td>7</td><td>6</td>" "<td>5</td><td>4</td><td>3</td><td>2</td>" "<td>1</td><td>0</td></tr>\r\n";    static prog_char trow_P[] = "<tr></tr>";    static prog_char tbot_P[] = "</table></form>\r\n</body>\r\n</html>";    NutHttpSendHeaderTop(stream, req, 200, "Ok");    NutHttpSendHeaderBot(stream, "text/html", -1);    fputs_P(ttop_P, stream);    DoCheckboxes(stream, "DDRA", inb(DDRA));    DoCheckboxes(stream, "PINA", inb(PINA));    DoCheckboxes(stream, "PORTA", inb(PORTA));    fputs_P(trow_P, stream);    DoCheckboxes(stream, "DDRB", inb(DDRB));    DoCheckboxes(stream, "PINB", inb(PINB));    DoCheckboxes(stream, "PORTB", inb(PORTB));    fputs_P(trow_P, stream);    DoCheckboxes(stream, "PORTC", inb(PORTC));    fputs_P(trow_P, stream);    DoCheckboxes(stream, "DDRD", inb(DDRD));    DoCheckboxes(stream, "PIND", inb(PIND));    DoCheckboxes(stream, "PORTD", inb(PORTD));    fputs_P(trow_P, stream);    DoCheckboxes(stream, "DDRE", inb(DDRE));    DoCheckboxes(stream, "PINE", inb(PINE));    DoCheckboxes(stream, "PORTE", inb(PORTE));    fputs_P(trow_P, stream);    DoCheckboxes(stream, "PINF", inb(PINF));    fputs_P(tbot_P, stream);    fflush(stream);    return 0;}THREAD(WebDemo, arg){    TCPSOCKET *sock;    FILE *stream;    IFNET *ifn = 0;    u_long ip_addr;             /* ICCAVR bugfix */    static prog_char netfail_P[] = "\nFailed to configure network " /* */                                   "interface: Ethernut stopped!\n\x07";    static prog_char dhcpfail_P[] = "\nFailed to configure network " /* */                                    "via DHCP: Ethernut stopped!\n\x07";    /*     * Register Realtek controller at address 8300 hex     * and interrupt 5.     */    if(nic == 1)        NutRegisterDevice(&devEth0, 0x8300, 5);#ifdef __AVR_ATmega128__    else        NutRegisterDevice(&devSmsc111, 0, 0);#endif    /*     * Configure lan interface.     */    ip_addr = inet_addr(my_ip);    if (ip_addr) {        if (NutNetIfConfig("eth0", my_mac, ip_addr, inet_addr(my_mask))) {            printf_P(netfail_P);            if (uart_bs >= 0) {                for (;;)                    NutSleep(1000);            } else {                asm("cli");                asm("call 0");            }        }    } else if (NutDhcpIfConfig("eth0", my_mac, 60000)) {        printf_P(dhcpfail_P);        if (uart_bs >= 0) {            for (;;)                NutSleep(1000);        } else {            asm("cli");            asm("call 0");        }    }    printf("MAC  %02X-%02X-%02X-%02X-%02X-%02X\nIP   %s",                   confnet.cdn_mac[0], confnet.cdn_mac[1],                   confnet.cdn_mac[2], confnet.cdn_mac[3], confnet.cdn_mac[4], confnet.cdn_mac[5],                   inet_ntoa(confnet.cdn_ip_addr));    printf("\nMask %s", inet_ntoa(confnet.cdn_ip_mask));    /*     * Add optional default route.     */    if (inet_addr(my_ip) && inet_addr(my_gate)) {        if (uart_bs >= 0)            printf("\nAdd gateway %s", my_gate);        NutIpRouteAdd(0, 0, inet_addr(my_gate), &devEth0);    }    else if (confnet.cdn_gateway && uart_bs >= 0)        printf("\nGate %s", inet_ntoa(confnet.cdn_gateway));    if(nic == 1)        ifn = (IFNET *) (devEth0.dev_icb);#ifdef __AVR_ATmega128__    else        ifn = (IFNET *) (devSmsc111.dev_icb);#endif    printf("\nHTTP server running. URL http://%s/\n", inet_ntoa(ifn->if_local_ip));    /*     * Register our device for the file system.     */    NutRegisterDevice(&devUrom, 0, 0);    /*     * Register CGI routines.     */    NutRegisterCgi("threads.cgi", ShowThreads);    NutRegisterCgi("timer.cgi", ShowTimer);    NutRegisterCgi("sockets.cgi", ShowSockets);    NutRegisterCgi("ports.cgi", ShowPorts);    /*     * Now loop endless for connections.     */    for (;;) {        /*         * Create a socket.         */        sock = NutTcpCreateSocket();        /*         * Listen on port 80. If we return,         * we got a client.         */        NutTcpAccept(sock, 80);        /*         * Create a stream from the socket, so we can use stdio.         */        stream = _fdopen((int) sock, "r+b");        /*         * Process http request.         */        NutHttpProcessRequest(stream);        /*         * Destroy our device.         */        fclose(stream);        /*         * Close our socket.         */        NutTcpCloseSocket(sock);    }}

⌨️ 快捷键说明

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