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

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

?? sw.c

?? Linux0.01內(nèi)核分析與操作系統(tǒng)設(shè)計(jì) 隨書源代碼
?? C
字號(hào):
/* sw.c */
/*
	使用停等協(xié)議來進(jìn)行通信的例子,程序運(yùn)行方法如下:

	sw s_s.dat s_r.dat sdl rdl 400
	sw r_s.dat r_r.dat rdl sdl 500

	400、500的延時(shí)很重要,如果設(shè)置太小,會(huì)導(dǎo)致信道忙,傳輸反而慢。
	設(shè)置太大,那么也會(huì)傳輸太慢。
*/


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <dos.h>
#include <io.h>


#define	true 	1
#define	false 	0

#define	FILE_WRITE_PERMISSION	2
#define	FILE_READ_PERMISSION    4

char PHYSICAL_DATA_LINK_FILE_WRITE[12];
char PHYSICAL_DATA_LINK_FILE_READ[12];

enum protocol_event {
    PACKET_READY,
    FRAME_ARRIVAL,
    TIME_OUT,
    NO_EVENT,
    ChannelIdle,
    CheckSumError
};

typedef	char packet;

struct frame		/* frame structure */
{
    packet info;
    int seq;
    int ack;
};

packet buffer;

int NextFrameToSend;
int FrameExpected;
int PacketLength;
int waiting;
int network_layer_flag;

FILE *fps, *fpr;
int fps_length;

#define INTR 0X1C    /* The clock tick interrupt */

int	init_timer_value;	/* a second is 17.2 tick */

void interrupt ( *oldhandler)();

int timer_count = 0;
int timer_run_flag = false;
int delay_time;

void interrupt handler()
{
    if(timer_run_flag)
    {
        timer_count--;
    }

    oldhandler();		/* call the old routine */
}


char *event_string(enum protocol_event e, char *e_str)
{
    switch (e)
    {
    case PACKET_READY:
        strcpy(e_str, "PACKET_READY");
        break;
    case FRAME_ARRIVAL:
        strcpy(e_str, "FRAME_ARRIVAL");
        break;
    case TIME_OUT:
        strcpy(e_str, "TIME_OUT");
        break;
    case NO_EVENT:
        strcpy(e_str, "NO_EVENT");
        break;
    case ChannelIdle:
        strcpy(e_str, "ChannelIdle");
        break;
    case CheckSumError:
        strcpy(e_str, "CheckSumError");
        break;
    default:
        strcpy(e_str, "Unknow Event");
        break;
    }
    return e_str;
}


void initialize(char *send_data, char *recv_data, char *send_dl, char *recv_dl, char *dt)
{
    fps = fopen(send_data, "rb");
    if(!fps){
        printf("Open file %s to read error!\n", send_data);
        exit(1);
    }
    fseek(fps,0L,SEEK_END);
    fps_length = ftell(fps);
    fseek(fps,0L,SEEK_SET);

    fpr = fopen(recv_data, "wb");
    if(!fpr){
        printf("Open file %s to write error!\n", recv_data);
        exit(1);
    }

    strcpy(PHYSICAL_DATA_LINK_FILE_WRITE, send_dl);
    strcpy(PHYSICAL_DATA_LINK_FILE_READ, recv_dl);

    delay_time = atoi(dt);			/* this is microsecond */
    init_timer_value =  ((((float)delay_time) / 1000.0) * 17.2) * 2;
    /*init_timer_value 設(shè)置為兩倍的傳輸時(shí)間!!*/

    /* at first, the physical link is idle */
    unlink(PHYSICAL_DATA_LINK_FILE_WRITE);
    unlink(PHYSICAL_DATA_LINK_FILE_READ);

    /* save the old interrupt vector */
    oldhandler = getvect(INTR);

    /* install the new interrupt handler */
    setvect(INTR, handler);

    NextFrameToSend = 0;
    FrameExpected = 0;
    PacketLength = 0;
    waiting = false;
    network_layer_flag = true;
}

void cleanup()
{
    fclose(fps);
    fclose(fpr);

    /* when exit, set the state of physical link to idle */
    unlink(PHYSICAL_DATA_LINK_FILE_WRITE);
    unlink(PHYSICAL_DATA_LINK_FILE_READ);

    /* reset the old interrupt handler */
    setvect(INTR, oldhandler);
}


void start_timer(void)
{
    timer_count = init_timer_value;
    timer_run_flag = true;
}

void stop_timer(void)
{
    timer_run_flag = false;
}

int check_timer_expire(void)
{
    if((timer_count <= 0) && (timer_run_flag))
        return 1;
    else
        return 0;
}

void enable_network_layer(void){
    network_layer_flag = true;
}

void disable_network_layer(void){
    network_layer_flag = false;
}

void get_packet_from_network(packet *buffer, int *PacketLength)
{
    (*buffer) = (packet)fgetc(fps);
    (*PacketLength) = sizeof(packet);
}

void put_packet_to_network(packet pk)
{
    fputc((int)pk, fpr);
    fflush(fpr);
}

void send_frame_to_physical(struct frame fr)
{
    FILE *fp;

    /* 二進(jìn)位打開檔寫,如果檔原來有內(nèi)容,將刪除原來的內(nèi)容 */
    fp = fopen(PHYSICAL_DATA_LINK_FILE_WRITE, "wb");
    if(!fp)
    {
        printf("Open data link file %s to write error!\n", PHYSICAL_DATA_LINK_FILE_WRITE);
        return;
    }
    fwrite(&fr, sizeof(struct frame),1, fp);
    fclose(fp);
}

void get_frame_from_physical(struct frame *fr)
{
    FILE *fp;

    /* 設(shè)置幀為無效 */
    fr->seq = -255;
    fr->ack = -255;

    fp = fopen(PHYSICAL_DATA_LINK_FILE_READ, "rb");
    if(!fp)
    {
        printf("Open data link file %s to read error!\n", PHYSICAL_DATA_LINK_FILE_READ);
        return;
    }
    fread(fr, sizeof(struct frame),1, fp);
    fclose(fp);

    /* this frame has been read, the file will be unlink */
    unlink(PHYSICAL_DATA_LINK_FILE_READ);
}

enum protocol_event get_event_from_physical()
{
#define	FILE_EXIST_FLAG	0
#define	FILE_READ_FLAG	4

    if(access(PHYSICAL_DATA_LINK_FILE_READ, FILE_READ_FLAG) == 0)
        return	FRAME_ARRIVAL;
    else
        return NO_EVENT;
}

int channel_idle(void)
{
    return true;		/* 認(rèn)為物理通道總是空閒 */
}

enum protocol_event get_event_from_timer()
{
    if(check_timer_expire())
    {
        stop_timer();
        return TIME_OUT;
    }
    else
        return NO_EVENT;
}

/* Main protocol service routine */
void stop_wait_protocol_datalink(int event)
{
    struct frame send_frame, recv_frame, ack_frame;
    int PacketLength;

    switch(event)
    {
    case PACKET_READY :
        /* a packet has arrived from the network layer */
        get_packet_from_network(&buffer, &PacketLength);
        send_frame.info = buffer;		/* place packet in frame */
        send_frame.seq = NextFrameToSend;

        /* piggyback acknowledge of last frame received */
        send_frame.ack = 1-FrameExpected;
        if(channel_idle())
        {
            send_frame_to_physical(send_frame); /* send it to physical layer */
            start_timer();
            printf("Send DATA frame {packet = '%c', seq = %d, ack = %d} to physical\n", send_frame.info, send_frame.seq, send_frame.ack);
            waiting = false;
        }
        else
            waiting = true;

        disable_network_layer();
        break;

    case FRAME_ARRIVAL :
        /* a frame has arrived from the physical layer */
        get_frame_from_physical(&recv_frame);		/* get the frame */
        printf("Get a frame {packet = '%c', seq = %d, ack = %d} from physical\n", recv_frame.info, recv_frame.seq, recv_frame.ack);
        /* check that it is the one that is expected */
        if (recv_frame.seq == FrameExpected)	/* 有效幀到達(dá),送到網(wǎng)路層 */
        {
            put_packet_to_network(recv_frame.info);	/* valid frame */
            printf("Put a packet to network {packet = %c}............\n", recv_frame.info);
            FrameExpected = 1-FrameExpected;

            /* 發(fā)送確認(rèn)幀 */
            ack_frame.info = '\0';
            ack_frame.seq = -1;
            ack_frame.ack = recv_frame.seq;		/* 確認(rèn)剛剛收到的一幀 */
            if(channel_idle())
            {
                send_frame_to_physical(ack_frame); /* send it to physical layer */
                printf("Send ACK frame {seq = %d, ack = %d}\n", ack_frame.seq, ack_frame.ack);
            }
        }
        if(recv_frame.ack == NextFrameToSend) /* acknowledgment has arrived,確認(rèn)到達(dá),可以發(fā)送下一幀 */
        {
            stop_timer();		/* 停止重發(fā)計(jì)時(shí)器 */

            enable_network_layer();
            NextFrameToSend = 1-NextFrameToSend;
        }
        break;

    case TIME_OUT :
        /* a frame has not been ACKed in time, */
        /* so re-send the outstanding frame */
        send_frame.info = buffer;
        send_frame.seq = NextFrameToSend;
        send_frame.ack = 1-FrameExpected;
        send_frame_to_physical(send_frame);
        start_timer();
        printf("Send DATA frame {packet = '%c', seq = %d, ack = %d) to physical\n", send_frame.info, send_frame.seq, send_frame.ack);
        break;

    case ChannelIdle:
        if ( waiting )
        {
            send_frame.info = buffer;
            send_frame.seq = NextFrameToSend;
            send_frame.ack = 1-FrameExpected;
            send_frame_to_physical(send_frame); /* send it to physical layer */
            start_timer();
            waiting = false;
        }
        break;
    case CheckSumError :	/* ignored */
        break;
    }
}

enum protocol_event get_event_from_network()
{
    if(!network_layer_flag)
        return NO_EVENT;

    if(ftell(fps) < fps_length)
        return PACKET_READY;
    else
        return NO_EVENT;

}

/*
	arg1	network send data (send file name)
	arg2	network receive data (receive file name)
*/
int main(int argc, char *argv[]){

    enum protocol_event event;
    char ev[20];
    unsigned int count;

    if(argc != 6)
    {
        printf("Usage: %s send_data recv_data send_dl  recv_dl delay_time", argv[0]);
        exit(0);
    }

    initialize(argv[1], argv[2], argv[3], argv[4], argv[5]);

    count = 1;
    printf("Protocol begin, any key to exit!\n\n");
    while(true)
    {
        printf("%d\n", count++);

        event = get_event_from_network();
        printf("Event from network = %s\n", event_string(event, ev));
        stop_wait_protocol_datalink(event);

        event = get_event_from_physical();
        printf("Event from physical = %s\n", event_string(event, ev));
        stop_wait_protocol_datalink(event);

        event = get_event_from_timer();
        printf("Event from timer = %s, timer_count = %d\n", event_string(event, ev), timer_count);
        stop_wait_protocol_datalink(event);

        delay(delay_time);

        if(kbhit())	break;
    }

    cleanup();

    return 0;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久99| 亚洲一级不卡视频| 欧美在线一二三| 狠狠色狠狠色合久久伊人| 亚洲欧美日韩系列| 久久综合精品国产一区二区三区 | 国产精品毛片大码女人| 91.com在线观看| 91污在线观看| 国产精品综合久久| 日本成人在线看| 亚洲美女视频一区| 久久久久久久综合色一本| 欧美精品v国产精品v日韩精品 | 91精品国产一区二区三区香蕉| 高清不卡在线观看av| 裸体一区二区三区| 亚洲国产一区在线观看| 成人欧美一区二区三区| 久久久久久黄色| 日韩区在线观看| 欧美日韩国产高清一区| 日本韩国精品在线| 99久久99久久精品免费观看| 久久99精品久久久久久国产越南| 亚洲h动漫在线| 一区二区三区日韩欧美精品 | 国产精品久久午夜| 2022国产精品视频| 精品久久久三级丝袜| 日韩一区二区免费在线电影| 在线播放视频一区| 欧美精品123区| 欧美人成免费网站| 欧美精品在线观看一区二区| 欧美亚洲综合网| 在线亚洲人成电影网站色www| 97精品电影院| 北条麻妃一区二区三区| 成人av影视在线观看| 国产精品一区二区果冻传媒| 久草热8精品视频在线观看| 久久精品国产精品亚洲综合| 精品一区二区三区视频| 九九九久久久精品| 国内精品伊人久久久久av影院 | 国内精品久久久久影院一蜜桃| 奇米色777欧美一区二区| 三级久久三级久久久| 日韩二区三区在线观看| 久久99精品国产麻豆不卡| 久久精品国产一区二区三区免费看| 久久精品国产亚洲aⅴ| 精品午夜久久福利影院| 国产裸体歌舞团一区二区| 国产精品一线二线三线精华| 国产**成人网毛片九色| 不卡电影免费在线播放一区| 91啪九色porn原创视频在线观看| 在线免费不卡视频| 欧美酷刑日本凌虐凌虐| 欧美白人最猛性xxxxx69交| 久久先锋影音av| 中文字幕一区二区三区精华液| 亚洲免费在线视频| 性做久久久久久| 国产自产2019最新不卡| 国产69精品久久777的优势| 色综合久久综合中文综合网| 欧美日韩国产精品自在自线| 精品福利一区二区三区| 国产精品精品国产色婷婷| 亚洲一区二区三区四区中文字幕| 青青青伊人色综合久久| 岛国一区二区三区| 日本精品免费观看高清观看| 日韩欧美精品三级| 亚洲欧洲美洲综合色网| 午夜激情久久久| 国产传媒欧美日韩成人| 在线观看亚洲精品视频| 精品国产乱码久久久久久浪潮| 国产精品成人在线观看| 日本欧美一区二区三区乱码 | 国产成人啪免费观看软件| 99久久99久久精品国产片果冻| 51久久夜色精品国产麻豆| 久久精品亚洲精品国产欧美 | 久久久久久久久久电影| 亚洲精品国久久99热| 裸体一区二区三区| 欧洲一区二区av| 久久精品视频在线免费观看| 亚洲福利电影网| 丰满岳乱妇一区二区三区| 欧美麻豆精品久久久久久| 欧美韩国一区二区| 免费成人美女在线观看| 日本黄色一区二区| 国产精品无人区| 美国毛片一区二区| 欧美影视一区二区三区| 国产欧美一区二区精品性| 日韩av不卡一区二区| 99re热这里只有精品免费视频| 欧美变态tickling挠脚心| 亚洲国产一区二区视频| 91亚洲精品久久久蜜桃网站| 精品久久久久久久久久久久久久久久久 | 91国产成人在线| 日本一二三不卡| 国内不卡的二区三区中文字幕| 欧美优质美女网站| 国产精品久久久久一区二区三区| 久久69国产一区二区蜜臀| 欧美日韩免费不卡视频一区二区三区| 国产婷婷一区二区| 极品少妇xxxx偷拍精品少妇| 欧美一级一级性生活免费录像| 夜夜爽夜夜爽精品视频| 99久久综合精品| 国产欧美日韩在线看| 精品一区二区三区影院在线午夜| 欧美美女网站色| 亚洲综合色成人| 色综合天天天天做夜夜夜夜做| 国产精品免费视频观看| 成人深夜在线观看| 日本一区二区视频在线| 国产宾馆实践打屁股91| 国产午夜精品美女毛片视频| 国产一区在线看| 精品国产乱码久久久久久牛牛| 九色|91porny| 精品1区2区在线观看| 国内精品免费**视频| www国产成人| 国产成人亚洲精品狼色在线| 久久久99精品免费观看不卡| 国产精品自拍一区| 中文一区在线播放| 成人三级伦理片| 亚洲欧美中日韩| 91蜜桃视频在线| 亚洲亚洲精品在线观看| 欧美三级日韩在线| 天天综合色天天综合色h| 在线播放91灌醉迷j高跟美女| 日韩精品一区第一页| 欧美一级理论片| 国产乱码精品一区二区三区五月婷| 久久久另类综合| youjizz久久| 一区二区三区高清| 欧美精品乱码久久久久久| 日本欧美大码aⅴ在线播放| 欧美成人一区二区三区片免费 | 一区二区在线看| 欧美日韩国产区一| 免费在线视频一区| 久久久久久一二三区| 北条麻妃一区二区三区| 亚洲第一在线综合网站| 欧美不卡一区二区三区| 成人夜色视频网站在线观看| 中文字幕一区二区日韩精品绯色| 欧美私模裸体表演在线观看| 日韩av中文字幕一区二区| 久久免费精品国产久精品久久久久| 国产在线不卡一区| 亚洲图片你懂的| 这里只有精品免费| 国产精品一区二区x88av| 一区二区成人在线| 日韩美女一区二区三区四区| 99热精品一区二区| 日本午夜一区二区| 国产精品你懂的| 欧美精品一级二级| 成人午夜看片网址| 亚洲国产aⅴ天堂久久| 久久色成人在线| 欧美中文字幕不卡| 国产盗摄视频一区二区三区| 亚洲成人免费观看| 国产精品剧情在线亚洲| 欧美电影影音先锋| 波多野结衣在线aⅴ中文字幕不卡| 亚洲成在人线免费| 中文无字幕一区二区三区| 欧美美女bb生活片| 96av麻豆蜜桃一区二区| 久久99久久久久| 亚洲一区二区三区自拍| 欧美国产丝袜视频| 日韩美女视频在线| 欧美视频一区二区在线观看| 豆国产96在线|亚洲| 麻豆成人综合网| 亚洲bt欧美bt精品777|