模拟网络通信中存储转发的分组交换算法
生活随笔
收集整理的這篇文章主要介紹了
模拟网络通信中存储转发的分组交换算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
概述:
在說明這個存儲轉發的分組交換算法,我想大家應該首先了解什么是分組交換。
分組交換:
? ? 分組交換很簡單,就是將接收端接收到的一連串數據先存儲下來,然后進行分組(分組的目的是因為原數據長度太長,在通信中,因為噪音的干擾會失真重傳。那么,這樣的話發送者就必須從頭開始將原數據再發送一次,這樣的通信在數據量比較多的情況顯然就會影響到通信效率),在分組的數據上進行添加首部,把這樣添加地首部的數據放網絡上進行傳輸。在目的端,再把分組的數據除掉首部,進行組裝,即是一個還原的過程。
部分代碼如下:
這個代碼是從文件中讀取數據,把讀取到的數據存儲在全局變量inform[]數組中;
/* -------------------------------- Reading File -------------------------------- */ int reading() {FILE * fp_r;fp_r = fopen(READING_PATH, "r");if (fp_r == NULL){printf("ERROR.your file is not being.\n");return ERROR;} char temp;temp = fgetc(fp_r); int i;memset(inform, 0, sizeof(inform)); for (i = 0; temp != EOF; ++i){inform[i] = temp;temp = fgetc(fp_r);}fclose(fp_r);return OK; }
拆分:
上面的代碼中,數組inform即是原數據,下面我要對這個原數據進行分組拆分,將它分成若干個小分組,再添加自定義的一個首部,代碼如下:
/* -------------------------------- Switch Packet Forwarding -------------------------------- */ int switchPacket() {FILE * fp_s;fp_s = fopen(PACKET_SWITCHED_PATH, "a+"); printf("Defines a segment length.\n");int i, j;int sub_len, len, len_head;scanf("%d", &sub_len);len = strlen(inform);len_head = strlen(HEAD);char temp[TEMP_MAX];memset(temp, 0, sizeof(temp));strcpy(temp, HEAD); // add headfor (i = 0, j = len_head; i < len; ++i){if ((i+1) % sub_len){temp[j] = inform[i];++j; // temp moving go back}else{temp[j] = inform[i]; // make up for location of sub_len++j; //temp[j] = '\n'; // new linefprintf(fp_s, "%s", temp); // write this packet to the filememset(temp, 0, sizeof(temp)); // redefine temp[]strcpy(temp, HEAD); // add headj = len_head; // reset location of temp[]}}fclose(fp_s);AssembleFrame(len_head, sub_len);return OK; }
還原:
而對分過組的數據段,必須還原,不然目的端接收到的數據就會是一串看不懂的字符串,即亂碼,讓人無法辨認。還原代碼如下:
/* -------------------------------- Assemble Frame -------------------------------- */ int AssembleFrame(int front, int rear) {FILE * fp_a;fp_a = fopen(PACKET_SWITCHED_PATH, "r");if (fp_a == NULL){return ERROR;}char temp, swstr[MAX*2], str[MAX];temp = fgetc(fp_a);int i, j;memset(swstr, 0, sizeof(swstr));memset(str, 0, sizeof(str));for (i = 0; temp != EOF; ++i){swstr[i] = temp;temp = fgetc(fp_a);}int len = strlen(swstr);for (i = 0, j = 0; i < len; ++i){if ((i+1) % (front+rear) == 0 || (i+1) % (front+rear) > front) // get char from front to (front+rear){str[j] = swstr[i];++j;} }printf("Group of data binding is: %s\n", str);fclose(fp_a);return OK; }
源代碼下載:
完整的程序代碼,我放在了我的網易博客上了。感興趣的朋友可以去看看,以下是連接。
http://blog.163.com/stone_sqrt3/blog/static/220412088201343011237752/
總結
以上是生活随笔為你收集整理的模拟网络通信中存储转发的分组交换算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北大OJ百练——4073:最长公共字符串
- 下一篇: 模拟计算机网络中的零比特填充