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

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? scratchp.c

?? 嵌入式TCPIP協(xié)議棧的源代碼!
?? C
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):
/* Scratch Protocol 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 28/10/99
** v0.02 JPB 1/11/99  Removed 'flags' from packet format
** v0.03 JPB 2/11/99  Reintroduced sequencing flags
** v0.04 JPB 3/11/99  Added SLIP support
** v0.05 JPB 4/11/99  Added config-file support
** v0.06 JPB 5/11/99  Revamped packet driver to support multiple classes
** v0.07 JPB 8/1/99   Updated packet format to use command string
** v0.08 JPB 8/1/99   Adapted Tx, Rx so txlen and rxlen include header length
** v0.09 JPB 9/11/99  Added sequencing
** v0.10 JPB 9/11/99  Added data queues
** v0.11 JPB 11/11/99 Improved sequence logic
** v0.12 JPB 12/11/99 Added circular buffer option to packet driver
** v0.13 JPB 15/11/99 Added network Tx and Rx circular buffers
** v0.14 JPB 16/11/99 Improved support for direct-drive of NE2000 card
** v0.15 JPB 16/11/99 Added SCRATCHE for use with DJGPP compiler
** v0.16 JPB 17/11/99 Fixed reentrancy problem on receive
** v0.17 JPB 18/11/99 Removed references to min() and max()
** v0.18 JPB 19/11/99 Completely revamped state machine
** v0.19 JPB 22/11/99 Added timeouts
** v0.20 JPB 23/11/99 Added WIN32 support
** v0.21 JPB 25/11/99 Fixed SLIP interface
** v0.22 JPB 26/11/99 Improved SCRATCHP state-machine
** v0.23 JPB 29/11/99 Added 'dir' command
** v0.24 JPB 30/11/99 Added 'get' and 'put'
** v0.25 JPB 1/12/99  Promoted 'seq' and 'ack' to 32-bit values
** v0.26 JPB 6/12/99  Added 3COM driver
** v0.27 JPB 30/12/99 Improved DJGPP compatibility - removed MAXPATH definition
** v0.28 JPB 6/4/00   Updated to use latest version of net drivers
** v0.29 JPB 13/8/00  Updated copyright notice
*/

#define VERSION "0.29"              /* This software version */

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>
#include <string.h>

/* Override the default circular buffer size used in TCPFS.H */
#define _CBUFFLEN_ 0x1000           /* Circ buffer size: MUST be power of 2 */

#include "ether.h"
#include "netutil.h"
#include "net.h"
#include "scratchp.h"

#define SCRATCHPVER 1               /* Protocol version number */
#define TESTLEN     SCRATCHPDLEN    /* Max size of 1 block of test data */
#define TESTBUFFLEN (TESTLEN*2)     /* Size of test data buffer */
#define TESTINC     1               /* Increment value for test data */
#define CFGFILE     "tcplean.cfg"   /* Default config filename */
#define NDIAGS      40              /* Number of diagnostic header entries */
#define DIAG_TX     1               /* Identifiers for diagnostic Tx, Rx hdrs */
#define DIAG_RX     2
#define ERRTIME     2               /* Error timeout in sec */
#define RETRIES     2               /* Number of error retries */
#define BLOCKLEN    255             /* Len of file xfer blk (excl. len byte) */
#define FILENAMELEN 40              /* Max length of get/put filename */

char cfgfile[MAXPATH+5]=CFGFILE;    /* Config filename */
BYTE testdata[TESTBUFFLEN];         /* Test data buffer */
LWORD testlen;
int txoff, rxoff;                   /* Tx, Rx offsets into test data */
GENFRAME genframe;                  /* Receive/transmit frame */
long txcount;                       /* Count of Rx bytes */
CBUFF txbuff={_CBUFFLEN_};          /* Circular buffer for transmit */
CBUFF rxbuff={_CBUFFLEN_};          /* Circular buffer for receive */
int statedebug, pktdebug, sigdebug; /* Flags to enable diagnostic printout */
char locid[IDLEN+1];                /* My (local) ident string */
char remid[IDLEN+1];                /* Remote node ident string */
BYTE remaddr[MACLEN];               /* Remote node address */
extern BYTE bcast[MACLEN];          /* Broadcast address */
char netcfg[40];                    /* Network config string */
int connstate;                      /* Network connection state */
int appstate;                       /* Application state */
char *connstates[]={STATENAMES};    /* Strings for connection states */
char *appstates[]={APPNAMES};       /* Diagnostic strings for states */
char *signames[] = {SIGNAMES};
BYTE apptemp[TESTLEN+1];            /* Temporary storage for app. data */
SCRATCHPHDR diaghdrs[NDIAGS];       /* Diagnostic storage of SCRATCHP headers */
int diagidx;                        /* Index into dignostic storage */
char kbuff[81];                     /* Keyboard buffer */
WORD errtimer, errcount;            /* Timer & counter for errors */
char *offon[] = {"off", "on"};      /* Off/on strings */
FILE *fhandle;                      /* File handle for GET and PUT */
char filename[FILENAMELEN+1];       /* File name for GET and PUT */
long filelen;                       /* File length for GET and PUT */
int breakflag;                      /* Flag to indicate ctrl-break pressed */

/* Prototypes */
int get_pkts(GENFRAME *nfp);
void prompt_user(void);
int do_scratchp(GENFRAME *nfp, int rxlen, int signal);
int do_apps(CBUFF *rxb, CBUFF *txb, int sig);
int do_dir(CBUFF *txb);
void newconnstate(int state);
void newappstate(int state);
void disp_sig(int sig);
int make_scratchp(GENFRAME *nfp, BYTE *dest, char *cmd, BYTE flags,
                  void *data, int dlen);
int make_scratchpds(GENFRAME *nfp, BYTE *dest, char *cmd, BYTE flags, char *str);
int put_scratchp(GENFRAME *nfp, WORD txlen);
int is_scratchp(GENFRAME *nfp, int len);
int swap_scratchp(GENFRAME *nfp);
void disp_scratchphdr(SCRATCHPHDR *sph);
void disp_scratchp(GENFRAME *nfp);
void dump_diags(void);
int read_cfg(char *fname);
int mygets(char *buff, int maxlen);

int main(int argc, char *argv[])
{
    char k, cmdkey=0;
    int i, keysig, connsig, sstep=0;
    WORD frametype, txlen=0;
    GENFRAME *nfp;

    printf("SCRATCHP v" VERSION "  ");      /* Sign on */
    if (!read_cfg(argc>1 ? argv[1] : 0))    /* Read config file */
    {
        printf("ERROR: invalid configuration file\n");
        exit(1);
    }
    printf("\n");                           /* Make random test data */
    for (i=0; i<TESTLEN; i++)
        testdata[i] = testdata[i+TESTLEN] = (BYTE)rand()&0xff;
    nfp = &genframe;                        /* Open net driver.. */
    nfp->g.dtype = frametype = open_net(netcfg);    /* ..get frame type */
    if (!frametype)
    {
        printf("ERROR: can't open network driver\n");
        exit(1);
    }
    else
    {
        newappstate(STATE_IDLE);            /* Set default states */
        newconnstate(APP_IDLE);
        timeout(&errtimer, 0);              /* Refresh timeout timer */
        while (!breakflag && cmdkey!='Q')   /* Main command loop.. */
        {
            txlen = keysig = connsig = 0;
            prompt_user();                  /* Prompt user on state change */
            if (sstep || kbhit())           /* If single-step or keypress..*/
            {
                k = getch();                /* ..get key */
                if (sstep)
                    timeout(&errtimer, 0);  /* If single-step, refresh timer */
                cmdkey = toupper(k);        /* Decode keystrokes.. */
                switch (cmdkey)             /* ..and generate signals */
                {
                case 'I':                   /* 'I': broadcast ident */
                    if (connstate != STATE_CONNECTED)
                        printf("Broadcast ident request\n");
                    keysig = SIG_USER_IDENT;
                    break;

                case 'O':                   /* 'O': open connection */
                    printf("Open connection: remote ident (RETURN if any)? ");
                    mygets(remid, IDLEN);
                    if (kbuff[0])
                        printf("Contacting '%s'..\n", remid);
                    else
                        printf("Contacting any node..\n");
                    keysig = SIG_USER_OPEN;
                    break;

                case 'D':                   /* 'D': directory */
                    printf("Directory of remote node\n");
                    if (connstate != STATE_CONNECTED)
                        printf("Error: not connected\n");
                    else
                        keysig = SIG_USER_DIR;
                    break;

                case 'E':                   /* 'E': echo data test */
                    if (connstate != STATE_CONNECTED)
                        printf("Error: not connected\n");
                    else
                    {
                        printf("Echo test\n");
                        keysig = SIG_USER_ECHO;
                    }
                    break;

                case 'G':                   /* 'G': get file from rmeote */
                    if (connstate != STATE_CONNECTED)
                        printf("Error: not connected\n");
                    else
                    {
                        printf("Filename to get? ");
                        if (mygets(filename, FILENAMELEN))
                            keysig = SIG_USER_GET;
                    }
                    break;

                case 'P':                   /* 'P': put file into remote */
                    if (connstate != STATE_CONNECTED)
                        printf("Error: not connected\n");
                    else
                    {
                        printf("Filename to put? ");
                        if (mygets(filename, FILENAMELEN))
                            keysig = SIG_USER_PUT;
                    }
                    break;

                case 'C':                   /* 'C': close connection */
                    printf("Closing connection..\n");
                    keysig = SIG_USER_CLOSE;
                    break;

                case 'S':                   /* 'S': single-step */
                    sstep = !sstep;
                    printf("Single-step %s\n", sstep ? "on" : "off");
                    break;

                case '?':                   /* '?': dump dignostic log */
                    printf("\n");
                    dump_diags();
                    break;
                }
            }                               /* Feed kbd signal to application */
            connsig = do_apps(&rxbuff, &txbuff, keysig);
            if (!connsig && connstate!=STATE_IDLE &&
                timeout(&errtimer, ERRTIME))/* If idle and timeout.. */
            {                               /* ..check error counter.. */
                if (errcount++ < RETRIES)
                    connsig = do_apps(&rxbuff, &txbuff, SIG_TIMEOUT);
                else                        /* ..signal 'timeout' or 'fail' */
                    connsig = do_apps(&rxbuff, &txbuff, SIG_FAIL);
            }                               /* Keep SCRATCHP alive */
            txlen = do_scratchp(nfp, 0, connsig);
            put_scratchp(nfp, txlen);       /* Transmit packet (if any) */
            txlen = get_pkts(nfp);          /* Check receive packets */
            put_scratchp(nfp, txlen);       /* Transmit response (if any) */
            poll_net(nfp->g.dtype);         /* Keep net drivers alive */
        }
        if (connstate)                      /* Shutdown: still connected? */
        {
            printf("Closing connection..");
            while (get_pkts(nfp))           /* Discard all receive packets.. */
                putchar(',');               /* ..then send 'stop' ..*/
            txlen = make_scratchp(nfp, remaddr, 0, FLAG_STOP, 0, 0);
            put_scratchp(nfp, txlen);
            while (get_pkts(nfp))           /* ..then discard any more.. */
                putchar('.');               /* (to ensure Tx buffer flushed) */
            putchar('\n');
            poll_net(nfp->g.dtype);         /* Keep net drivers alive */
        }
    }
    close_net(frametype);                   /* Close network drver */
    return(0);
}

/* Demultiplex incoming packets */
int get_pkts(GENFRAME *nfp)
{
    int rxlen, txlen=0;

    if ((rxlen=get_frame(nfp)) > 0)         /* If any packet received.. */
    {
        if (is_scratchp(nfp, rxlen))        /* If SCRATCHP.. */
        {
            swap_scratchp(nfp);                 /* ..do byte-swaps.. */
            txlen = do_scratchp(nfp, rxlen, 0); /* ..action it.. */
        }
    }                                       /* ..and maybe return a response */
    return(txlen);                          /* (using the same pkt buffer) */
}

/* Prompt user depending on connection & application states, & kbd signal */
void prompt_user(void)
{
    static int lastappstate=0, lastconnstate=-1;
    static long lastfilelen=0;

    if (lastfilelen != filelen)
        printf("%lu bytes     \r", filelen);
    lastfilelen = filelen;
    if (appstate != lastappstate)
    {
        if (appstate == APP_FILE_RECEIVER)
            printf("Receiving '%s'..\n", filename);
        if (appstate == APP_FILE_SENDER)
            printf("Sending '%s'..\n", filename);
        else if (lastappstate==APP_FILE_SENDER ||
                 lastappstate==APP_FILE_RECEIVER)
        {
            if (!filelen)
                printf("ERROR: file not found\n");
            else
                printf("%lu bytes transferred\n", filelen);
        }
        if (appstate == APP_ECHO_SERVER)
            printf("Echo server running... [C]lose connection?\n");
        else if (appstate == APP_ECHO_CLIENT)
            printf("Echo client running... [C]lose connection?\n");
        lastappstate = appstate;
    }
    else if (connstate != lastconnstate)
    {
        if (connstate == STATE_IDLE)
            printf("Connection closed: [I]dent, [O]pen, [Q]uit?\n");
        if (connstate == STATE_CONNECTED)
        {
            printf("Connected");
            if (*remid)
                printf(" to '%s'", remid);
            printf(": [D]ir [G]et [P]ut [E]cho [C]lose?\n");
        }
        lastconnstate = connstate;
    }
}

/* SCRATCHP connection state machine; given packet buffer and Rx len
** If Rx len is non-zero, process the incoming SCRATCHP packet,
** Otherwise, only check for state chamges or timeouts,
** Return non-zero packet length (incl. SCRATCHP hdr) if responding */
int do_scratchp(GENFRAME *nfp, int rxlen, int sig)
{
    WORD n, trylen, tx=0, txlen=0, crlen=0, dlen=0, txw;
    LWORD oldrx, rxw, acked=0;
    static LWORD txack;
    char *errstr=0, temps[22];

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线精品观看国产| 91.xcao| 天天综合网 天天综合色| 久久奇米777| 欧美精品久久99久久在免费线 | 国产九色精品成人porny| 亚洲免费av观看| 久久综合网色—综合色88| 91传媒视频在线播放| 国产91富婆露脸刺激对白| 天堂一区二区在线| 一区二区在线看| 国产精品网曝门| 欧美mv和日韩mv的网站| 欧美巨大另类极品videosbest | 精品国产凹凸成av人导航| 在线亚洲一区二区| 国产成人精品亚洲777人妖| 蜜桃一区二区三区四区| 亚洲一区视频在线| 日韩美女精品在线| 欧美国产精品中文字幕| www亚洲一区| 精品久久国产字幕高潮| 欧美日韩成人高清| 欧美色老头old∨ideo| 91丨九色丨蝌蚪丨老版| k8久久久一区二区三区| 成人国产免费视频| 国产一区二区三区精品视频| 麻豆中文一区二区| 蜜臀av性久久久久蜜臀aⅴ四虎 | 欧美日韩国产高清一区二区三区 | 7777精品伊人久久久大香线蕉的| 97aⅴ精品视频一二三区| 成人免费高清在线观看| 风间由美一区二区三区在线观看 | 97se亚洲国产综合自在线不卡| 欧美一卡二卡三卡四卡| 欧美亚洲自拍偷拍| 在线观看国产91| 欧美不卡一二三| 日本韩国精品在线| 国产精品久久久久久亚洲伦 | 成人午夜在线播放| 国产成人日日夜夜| 高清不卡一二三区| 92国产精品观看| 日本久久一区二区三区| 欧美综合视频在线观看| 欧美无乱码久久久免费午夜一区| 欧美艳星brazzers| 日韩西西人体444www| 日韩欧美美女一区二区三区| 精品久久久久久久人人人人传媒 | 国内外成人在线视频| 经典三级一区二区| 国产精品一级片| 成人看片黄a免费看在线| 色综合天天视频在线观看| 欧美系列亚洲系列| 欧美成人高清电影在线| 国产欧美日韩中文久久| 综合在线观看色| 亚洲.国产.中文慕字在线| 蜜桃久久久久久| 成人午夜激情片| 欧美在线一区二区三区| 日韩一区二区视频| 中日韩免费视频中文字幕| 亚洲免费观看高清完整版在线 | 日日夜夜免费精品| 国产剧情av麻豆香蕉精品| 99国产精品国产精品毛片| 欧美日韩电影一区| 26uuu精品一区二区在线观看| 国产精品久久久久久久第一福利| 一区2区3区在线看| 久久国产尿小便嘘嘘尿| 成人视屏免费看| 在线成人免费视频| 欧美国产精品一区二区| 一区二区三区精品视频| 久久99热狠狠色一区二区| 91丝袜美女网| 日韩免费看网站| 亚洲激情五月婷婷| 极品少妇xxxx精品少妇偷拍 | 精品成人佐山爱一区二区| 综合色中文字幕| 久久99热这里只有精品| 91丝袜美腿高跟国产极品老师 | 免费一级片91| 91在线云播放| 久久奇米777| 日韩精品欧美精品| 99精品久久只有精品| 精品人在线二区三区| 一区二区三区自拍| 成人一区二区三区中文字幕| 欧美高清激情brazzers| 亚洲欧美另类久久久精品2019| 久久99精品视频| 欧美日韩国产精选| 亚洲欧美日韩一区二区| 国产精品亚洲第一区在线暖暖韩国| 欧洲精品中文字幕| 自拍视频在线观看一区二区| 国产尤物一区二区| 日韩久久久精品| 天堂av在线一区| 在线一区二区三区四区| 国产精品毛片大码女人| 激情久久五月天| 欧美一区在线视频| 婷婷一区二区三区| 欧美视频一区二| 亚洲色图在线播放| 99麻豆久久久国产精品免费优播| 日韩欧美一卡二卡| 日韩在线卡一卡二| 欧美色老头old∨ideo| 亚洲免费色视频| 97精品超碰一区二区三区| 国产欧美日韩不卡| 国产精品小仙女| 久久九九全国免费| 国产精品一线二线三线| 欧美精品一区二区在线观看| 秋霞影院一区二区| 日韩三级电影网址| 日产精品久久久久久久性色| 欧美久久久久久久久| 视频一区二区三区中文字幕| 欧美色手机在线观看| 亚洲国产精品久久人人爱| 欧美性色欧美a在线播放| 一个色妞综合视频在线观看| 欧美系列日韩一区| 天天综合天天综合色| 欧美一区二区三区精品| 久久精品国产久精国产| 久久无码av三级| 丰满放荡岳乱妇91ww| 亚洲欧洲另类国产综合| 91丨九色丨国产丨porny| 亚洲精品亚洲人成人网在线播放| 一本一道久久a久久精品| 亚洲综合色噜噜狠狠| 欧美三级电影一区| 免费高清在线一区| 久久久久久夜精品精品免费| 国产福利一区在线观看| 国产精品久久综合| 日本国产一区二区| 日韩精品欧美精品| 久久在线观看免费| 91亚洲精品久久久蜜桃网站| 亚洲精品一二三| 欧美一卡2卡三卡4卡5免费| 国产在线不卡视频| 中文在线资源观看网站视频免费不卡| 成人晚上爱看视频| 一区二区成人在线| 日韩欧美中文字幕精品| 国产 欧美在线| 亚洲午夜在线观看视频在线| 日韩欧美国产1| 不卡一区在线观看| 香蕉影视欧美成人| 久久久久免费观看| 欧美优质美女网站| 久久av资源网| 一区二区三区在线视频免费| 欧美丰满少妇xxxxx高潮对白| 国产美女精品一区二区三区| 亚洲色图20p| 日韩久久精品一区| 一本色道**综合亚洲精品蜜桃冫| 全国精品久久少妇| 亚洲欧洲日本在线| 日韩午夜在线观看| 色呦呦国产精品| 老色鬼精品视频在线观看播放| 国产精品成人免费精品自在线观看| 欧美性大战久久久| 国产精品亚洲午夜一区二区三区 | 国产精品丝袜91| 欧美巨大另类极品videosbest| 国产一区二区伦理| 亚洲午夜久久久久久久久电影院| 国产午夜一区二区三区| 在线这里只有精品| 粉嫩aⅴ一区二区三区四区五区| 亚洲午夜三级在线| 国产精品大尺度| 久久综合狠狠综合久久综合88 | 国产麻豆9l精品三级站| 亚洲观看高清完整版在线观看| 中文字幕精品一区|