您的位置:首页 > 理论基础 > 计算机网络

模拟网络通信中存储转发的分组交换算法

2014-04-17 11:27 453 查看


概述:

在说明这个存储转发的分组交换算法,我想大家应该首先了解什么是分组交换。


分组交换:

    分组交换很简单,就是将接收端接收到的一连串数据先存储下来,然后进行分组(分组的目的是因为原数据长度太长,在通信中,因为噪音的干扰会失真重传。那么,这样的话发送者就必须从头开始将原数据再发送一次,这样的通信在数据量比较多的情况显然就会影响到通信效率),在分组的数据上进行添加首部,把这样添加地首部的数据放网络上进行传输。在目的端,再把分组的数据除掉首部,进行组装,即是一个还原的过程。


部分代码如下:

这个代码是从文件中读取数据,把读取到的数据存储在全局变量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 head

for (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 line
fprintf(fp_s, "%s", temp); // write this packet to the file
memset(temp, 0, sizeof(temp)); // redefine temp[]
strcpy(temp, HEAD); //  add head
j = 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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐