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

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

?? tinytcp.c

?? TCPIP源代碼C語言版本
?? C
?? 第 1 頁 / 共 2 頁
字號:
#ifdef DEBUG
        if ( tcp_logState & tcp_LOGPACKETS ) tcp_DumpHeader(ip, tp, "Discarding");
#endif
        return;
    }

#ifdef DEBUG
    if ( tcp_logState & tcp_LOGPACKETS )
        tcp_DumpHeader(ip, tp, "Received");
#endif

    /* save his ethernet address */
    MoveW(&((((eth_Header *)ip) - 1)->source[0]), &s->hisethaddr[0], sizeof(eth_HwAddress));

    ph.src = ip->source;
    ph.dst = ip->destination;
    ph.mbz = 0;
    ph.protocol = 6;
    ph.length = len;
    ph.checksum = checksum(tp, len);
    if ( checksum(&ph, sizeof ph) != 0xffff )
         printf("bad tcp checksum, received anyway\n");

    flags = tp->flags;
    if ( flags & tcp_FlagRST ) {
        printf("connection reset\n");
        s->state = tcp_StateCLOSED;
        s->dataHandler(s, 0, -1);
        tcp_Unthread(s);
        return;
    }

    switch ( s->state ) {

    case tcp_StateLISTEN:
        if ( flags & tcp_FlagSYN ) {
            s->acknum = tp->seqnum + 1;
            s->hisport = tp->srcPort;
            s->hisaddr = ip->source;
            s->flags = tcp_FlagSYN | tcp_FlagACK;
            tcp_Send(s);
            s->state = tcp_StateSYNREC;
            s->unhappy = true;
            s->timeout = tcp_TIMEOUT;
            printf("Syn from 0x%x#%d (seq 0x%x)\n", s->hisaddr, s->hisport, tp->seqnum);
        }
        break;

    case tcp_StateSYNSENT:
        if ( flags & tcp_FlagSYN ) {
            s->acknum++;
            s->flags = tcp_FlagACK;
            s->timeout = tcp_TIMEOUT;
            if ( (flags & tcp_FlagACK) && tp->acknum == (s->seqnum + 1) ) {
                printf("Open\n");
                s->state = tcp_StateESTAB;
                s->seqnum++;
                s->acknum = tp->seqnum + 1;
                s->unhappy = false;
            } else {
                s->state = tcp_StateSYNREC;
            }
        }
        break;

    case tcp_StateSYNREC:
        if ( flags & tcp_FlagSYN ) {
            s->flags = tcp_FlagSYN | tcp_FlagACK;
            tcp_Send(s);
            s->timeout = tcp_TIMEOUT;
            printf(" retransmit of original syn\n");
        }
        if ( (flags & tcp_FlagACK) && tp->acknum == (s->seqnum + 1) ) {
            s->flags = tcp_FlagACK;
            tcp_Send(s);
            s->seqnum++;
            s->unhappy = false;
            s->state = tcp_StateESTAB;
            s->timeout = tcp_TIMEOUT;
            printf("Synack received - connection established\n");
        }
        break;

    case tcp_StateESTAB:
        if ( (flags & tcp_FlagACK) == 0 ) return;
        /* process ack value in packet */
        diff = tp->acknum - s->seqnum;
        if ( diff > 0 ) {
            Move(&s->data[diff], &s->data[0], diff);
            s->dataSize -= diff;
            s->seqnum += diff;
        }
        s->flags = tcp_FlagACK;
        tcp_ProcessData(s, tp, len);
        break;

    case tcp_StateFINWT1:
        if ( (flags & tcp_FlagACK) == 0 ) return;
        diff = tp->acknum - s->seqnum - 1;
        s->flags = tcp_FlagACK | tcp_FlagFIN;
        if ( diff == 0 ) {
            s->state = tcp_StateFINWT2;
            s->flags = tcp_FlagACK;
            printf("finack received.\n");
        }
        tcp_ProcessData(s, tp, len);
        break;

    case tcp_StateFINWT2:
        s->flags = tcp_FlagACK;
        tcp_ProcessData(s, tp, len);
        break;

    case tcp_StateCLOSING:
        if ( tp->acknum == (s->seqnum + 1) ) {
            s->state = tcp_StateTIMEWT;
            s->timeout = tcp_TIMEOUT;
        }
        break;

    case tcp_StateLASTACK:
        if ( tp->acknum == (s->seqnum + 1) ) {
            s->state = tcp_StateCLOSED;
            s->unhappy = false;
            s->dataSize = 0;
            s->dataHandler(s, 0, 0);
            tcp_Unthread(s);
            printf("Closed.    \n");
        } else {
            s->flags = tcp_FlagACK | tcp_FlagFIN;
            tcp_Send(s);
            s->timeout = tcp_TIMEOUT;
            printf("retransmitting FIN\n");
        }
        break;

    case tcp_StateTIMEWT:
        s->flags = tcp_FlagACK;
        tcp_Send(s);
    }
}

/*
 * Process the data in an incoming packet.
 * Called from all states where incoming data can be received: established,
 * fin-wait-1, fin-wait-2
 */
tcp_ProcessData(s, tp, len)
    tcp_Socket *s;
    tcp_Header *tp;
    int len;
{
    int diff, x;
    word flags;
    byte *dp;

    flags = tp->flags;
    diff = s->acknum - tp->seqnum;
    if ( flags & tcp_FlagSYN ) diff--;
    x = tcp_GetDataOffset(tp) << 2;
    dp = (byte *)tp + x;
    len -= x;
    if ( diff >= 0 ) {
        dp += diff;
        len -= diff;
        s->acknum += len;
        s->dataHandler(s, dp, len);
        if ( flags & tcp_FlagFIN ) {
            s->acknum++;
#ifdef DEBUG
            printf("consumed fin.\n");
#endif
            switch(s->state) {
              case tcp_StateESTAB:
                /* note: skip state CLOSEWT by automatically closing conn */
                x = tcp_StateLASTACK;
                s->flags |= tcp_FlagFIN;
                s->unhappy = true;
#ifdef DEBUG
                printf("sending fin.\n");
#endif
                break;
              case tcp_StateFINWT1:
                x = tcp_StateCLOSING;
                break;
              case tcp_StateFINWT2:
                x = tcp_StateTIMEWT;
                break;
            }
            s->state = x;
        }
    }
    s->timeout = tcp_TIMEOUT;
    tcp_Send(s);
}

/*
 * Format and send an outgoing segment
 */
tcp_Send(s)
    tcp_Socket *s;
{
    tcp_PseudoHeader ph;
    struct _pkt {
        in_Header in;
        tcp_Header tcp;
        longword maxsegopt;
    } *pkt;
    byte *dp;

    pkt = (struct _pkt *)sed_FormatPacket(&s->hisethaddr[0], 0x800);
    dp = &pkt->maxsegopt;

    pkt->in.length = sizeof(in_Header) + sizeof(tcp_Header) + s->dataSize;

    /* tcp header */
    pkt->tcp.srcPort = s->myport;
    pkt->tcp.dstPort = s->hisport;
    pkt->tcp.seqnum = s->seqnum;
    pkt->tcp.acknum = s->acknum;
    pkt->tcp.window = 1024;
    pkt->tcp.flags = s->flags | 0x5000;
    pkt->tcp.checksum = 0;
    pkt->tcp.urgentPointer = 0;
    if ( s->flags & tcp_FlagSYN ) {
        pkt->tcp.flags += 0x1000;
        pkt->in.length += 4;
        pkt->maxsegopt = 0x02040578; /* 1400 bytes */
        dp += 4;
    }
    MoveW(s->data, dp, s->dataSize);

    /* internet header */
    pkt->in.vht = 0x4500;   /* version 4, hdrlen 5, tos 0 */
    pkt->in.identification = tcp_id++;
    pkt->in.frag = 0;
    pkt->in.ttlProtocol = (250<<8) + 6;
    pkt->in.checksum = 0;
    pkt->in.source = sin_lclINAddr;
    pkt->in.destination = s->hisaddr;
    pkt->in.checksum = ~checksum(&pkt->in, sizeof(in_Header));

    /* compute tcp checksum */
    ph.src = pkt->in.source;
    ph.dst = pkt->in.destination;
    ph.mbz = 0;
    ph.protocol = 6;
    ph.length = pkt->in.length - sizeof(in_Header);
    ph.checksum = checksum(&pkt->tcp, ph.length);
    pkt->tcp.checksum = ~checksum(&ph, sizeof ph);

#ifdef DEBUG
    if ( tcp_logState & tcp_LOGPACKETS )
        tcp_DumpHeader(&pkt->in, &pkt->tcp, "Sending");
#endif

    sed_Send(pkt->in.length);
}

/*
 * Do a one's complement checksum
 */
checksum(dp, length)
    word *dp;
    int length;
{
    int len;
    longword sum;

    len = length >> 1;
    sum = 0;
    while ( len-- > 0 ) sum += *dp++;
    if ( length & 1 ) sum += (*dp & 0xFF00);
    sum = (sum & 0xFFFF) + ((sum >> 16) & 0xFFFF);
    sum = (sum & 0xFFFF) + ((sum >> 16) & 0xFFFF);

    return ( sum );
}

/*
 * Dump the tcp protocol header of a packet
 */
tcp_DumpHeader( ip, tp, mesg )
    in_Header *ip;
    char *mesg;
{
    register tcp_Header *tp = (tcp_Header *)((byte *)ip + in_GetHdrlenBytes(ip));
    static char *flags[] = { "FIN", "SYN", "RST", "PUSH", "ACK", "URG" };
    int len;
    word f;

    len =  ip->length - ((tcp_GetDataOffset(tp) + in_GetHdrlen(ip)) << 2);
    printf("TCP: %s packet:\nS: %x; D: %x; SN=%x ACK=%x W=%d DLen=%d\n",
           mesg, tp->srcPort, tp->dstPort, tp->seqnum, tp->acknum,
           tp->window, len);
    printf("DO=%d, C=%x U=%d",
           tcp_GetDataOffset(tp), tp->checksum, tp->urgentPointer);
    /* output flags */
    f = tp->flags;
    for ( len = 0; len < 6; len++ )
        if ( f & (1 << len) ) printf(" %s", flags[len]);
    printf("\n");
}

/*
 * Move bytes from hither to yon
 */
Move( src, dest, numbytes )
    register byte *src, *dest;
    register numbytes;
{
    if ( numbytes <= 0 ) return;
    if ( src < dest ) {
        src += numbytes;
        dest += numbytes;
        do {
            *--dest = *--src;
        } while ( --numbytes > 0 );
    } else
        do {
             *dest++ = *src++;
        } while ( --numbytes > 0 );
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区精品在线观看| 国产一二三精品| 东方aⅴ免费观看久久av| 日韩三区在线观看| 国产一区视频网站| 精品综合久久久久久8888| 亚洲国产精品成人久久综合一区| 国产91对白在线观看九色| 美国精品在线观看| 国产精品九色蝌蚪自拍| 欧美日韩一区二区电影| 九九在线精品视频| 久久激情综合网| 国产精品久久久久久久久免费丝袜 | aaa欧美大片| 一区二区三区四区蜜桃| 亚洲美女视频在线观看| 日韩一级黄色片| 日韩视频永久免费| 久久蜜桃av一区二区天堂 | 一区二区三区中文在线| 一级精品视频在线观看宜春院| 亚洲欧美自拍偷拍| 欧美一卡2卡3卡4卡| 99久久综合狠狠综合久久| 91美女在线看| 国产91高潮流白浆在线麻豆| caoporm超碰国产精品| 在线观看欧美黄色| 国产成人av影院| 日本不卡一区二区三区 | 性久久久久久久| 久久久91精品国产一区二区三区| 欧美日韩国产色站一区二区三区| 成人污视频在线观看| 精品中文字幕一区二区| 成人一二三区视频| 在线观看91精品国产入口| 欧美日韩国产高清一区| 精品国偷自产国产一区| 欧美日韩午夜在线| 久久女同性恋中文字幕| 亚洲美女电影在线| 麻豆高清免费国产一区| av不卡在线播放| 欧美一区二区视频在线观看2020| 日韩高清中文字幕一区| 麻豆精品在线观看| 91免费精品国自产拍在线不卡| 7777精品伊人久久久大香线蕉的| 久久99九九99精品| 色综合天天综合狠狠| 国产999精品久久| 欧美视频一区二区三区四区| 91国偷自产一区二区使用方法| 成人丝袜18视频在线观看| 3751色影院一区二区三区| 亚洲欧洲成人精品av97| 精品一区二区av| 67194成人在线观看| 亚洲欧美日韩人成在线播放| 国产精品一区二区视频| 成人免费av在线| 日韩一区国产二区欧美三区| 国产欧美一区二区精品久导航| 久久综合九色综合97婷婷女人 | 北岛玲一区二区三区四区| 欧美一区三区四区| 亚洲一区在线播放| 毛片基地黄久久久久久天堂| 欧美手机在线视频| 亚洲精品美腿丝袜| 丝袜美腿亚洲色图| 国内精品久久久久影院薰衣草| 福利视频网站一区二区三区| 日韩精品中文字幕一区二区三区 | 久久新电视剧免费观看| 日韩精品福利网| 欧美无乱码久久久免费午夜一区| 中文字幕一区二区三区四区| 国产传媒日韩欧美成人| 精品1区2区在线观看| 国内精品久久久久影院色| 日韩三级中文字幕| 美洲天堂一区二卡三卡四卡视频| 9191久久久久久久久久久| 亚洲成人第一页| 欧美日韩一区二区三区四区五区| 亚洲国产日韩综合久久精品| 黄色精品一二区| 精品国产乱码久久久久久久久| 毛片一区二区三区| 精品国产乱码久久久久久久| 国产乱码精品一区二区三| 久久久国产午夜精品| 国产二区国产一区在线观看| 国产精品毛片久久久久久久| 日韩**一区毛片| 欧美成人aa大片| 性做久久久久久免费观看| 一本色道久久综合亚洲aⅴ蜜桃| 精品久久久久久久久久久久包黑料 | av色综合久久天堂av综合| 亚洲欧美色一区| 欧美日韩专区在线| 狠狠色狠狠色综合系列| 中文字幕在线观看一区| 欧美日韩国产综合久久| 国产在线精品一区二区| 国产精品久久久久久久久免费樱桃| 色婷婷久久综合| 蜜臂av日日欢夜夜爽一区| 国产精品久久久久久久浪潮网站| 欧美在线免费播放| 国产精品自拍网站| 亚洲综合视频网| 精品国产乱码91久久久久久网站| 91在线一区二区三区| 欧美激情一区在线观看| 欧美日韩在线直播| 国产成人在线视频网址| 一二三四区精品视频| 欧美精品一区二区久久婷婷| 在线一区二区三区| 国产精品一品二品| 天天综合日日夜夜精品| 欧美色电影在线| 国产一区 二区| 亚洲成人激情av| 亚洲乱码国产乱码精品精小说 | 国产性色一区二区| 欧美日韩中文字幕精品| 成人涩涩免费视频| 精品国产三级a在线观看| 国产原创一区二区| 亚洲精品亚洲人成人网在线播放| 欧美r级在线观看| 欧美在线综合视频| 菠萝蜜视频在线观看一区| 欧美一区二区三区的| 91免费观看视频| 国产成人免费视频网站| 麻豆精品在线视频| 亚洲国产成人av网| 亚洲精选视频在线| 国产精品不卡一区| 日本一区二区三级电影在线观看 | 99re视频精品| 本田岬高潮一区二区三区| 国产一二精品视频| 加勒比av一区二区| 天堂va蜜桃一区二区三区| 国产三级精品三级| 久久九九全国免费| 欧美mv日韩mv亚洲| 日韩一区二区三区在线| 欧美一区二区美女| 91精品国产欧美日韩| 69久久99精品久久久久婷婷| 欧美日韩精品一区二区| 欧美日韩一区二区在线视频| 欧美系列在线观看| 欧美日韩小视频| 555www色欧美视频| 日韩一级在线观看| 日韩精品一区二区三区视频| 精品乱人伦小说| 久久久亚洲高清| 国产精品天美传媒沈樵| 亚洲日本在线视频观看| 欧美人狂配大交3d怪物一区 | 色狠狠色狠狠综合| 在线观看三级视频欧美| 欧美亚洲动漫精品| 3d成人动漫网站| 2023国产精华国产精品| 国产日韩欧美a| 亚洲天堂免费看| 亚洲成人自拍一区| 精品在线观看免费| 成人美女在线视频| 在线观看日产精品| 亚洲精品一区二区三区99| 国产日韩欧美制服另类| **性色生活片久久毛片| 亚洲成人免费影院| 精品中文av资源站在线观看| 成人精品视频.| 欧美视频一区在线观看| 精品国产伦一区二区三区观看体验| 久久久亚洲精品石原莉奈| 综合久久综合久久| 美女mm1313爽爽久久久蜜臀| 成人av集中营| 欧美一区二区三区人| 国产精品久久久久影视| 日韩av在线免费观看不卡| 国产91在线看| 91精品婷婷国产综合久久竹菊| 国产日韩视频一区二区三区|