资源简介

上传的文件中包含《计算机网络实验系统 NetRiver2000》中的前九个实验,代码思路清晰,注释详尽

资源截图

代码片段和文件信息

#include “sysinclude.h“
#include 
#include 
#include 
#include 
#include 
using namespace std;

extern void SendframePacket(unsigned char* pData unsigned int len);

#define WINDOW_SIZE_STOP_WAIT           1
#define WINDOW_SIZE_BACK_N_frame        4


#define MAX_DATA_SIZE                   100

typedef enum {data ack nak} frame_kind;
typedef struct
{
    frame_kind  kind;                   // kind of frame
    unsigned int seq;                   // seq no of frame
    unsigned int ack;                   // ack no of frame
    unsigned char data[MAX_DATA_SIZE];  // data
}frame_head;

typedef struct
{
    frame_head head;                    // frame head
    unsigned int size;                  // frame sizei actual size of data
}frame;

/*
 * 停等协议测试函数
 * 参数说明:
 *** pBuffer    指针,系统要发送或者已经接收到的帧内容,或者指向超时信息中
                的超时帧序号
 *** bufferSize     pBuffer表示内容的长度
 *** messageType    传入消息的类型,可选项由宏定义
 * 返回值:
 *** 0  发送成功
 *** -1 发送失败
 */
int stud_slide_window_stop_and_wait(char *pBuffer 
                                    int bufferSize 
                                    UINT8 messageType)
{
    /*
     * 为方便后续两个函数的编程,我们定义两个队列:
     *** waitQueue
     ****** 暂时无法发送的数据包(没有可用窗口),缓存在该队列中;
     *** confirmQueue
     ****** 已经发送但是尚未确认的数据包,缓存在该队列中;
     * 注:对于停止等待协议而言,confirmQueue其实不需要,我们可以使用一个结构体记录
     * 尚未确认的数据包即可,因为该协议中,尚未确认的数据包数目永远不会大于1。
     */
    static queueame> waitQueue;
    static vectorame> confirmQueue;
    static unsigned int expectedNo = 0;   // 记录当前期望收到的数据包 seq no

    /*
     * 当上层传来一个新数据包 i 时,我们需要进行如下判断:
     * Case1...messageType == MSG_TYPE_SEND
     *** Subcase1...waitQueue 不为空
     ****** 我们采用 FIFO 方案,此时仅仅需要将 i 挂载到 waitQueue 队列尾部,
            并且为之标记序号;
     ** Subcase2...waitQueue 为空
     ****** 我们需要进一步判断:
            Subsubcase1...confirmQueue 为空
                我们直接发送当前数据包
            Subsubcase2...comfirmQueue 不为空
                将数据包 i 挂载到 waitQueue 队列,并为之标记序号
     *** Case2...messageType == MSG_TYPE_RECEIVE && ACK
     ****** 此时检查 ACK(i) 所响应的数据包 (i-1) 是否存在于 confirmQueue:
            如果存在则直接删除,并且检查 waitQueue 中是否存在需要发送的数据包;
            如果不存在,直接丢弃当前ACK数据包
     *** Case3...messageType == MSG_TYPE_TIMEOUT
     ****** 如果 confirmQueue 中存在数据包,则重新发送这个数据包;
            如果不存在,说明程序出现bug;
     */
    switch( messageType )
    {
        case MSG_TYPE_TIMEOUT:
        {
            if ( confirmQueue.size() == 0 )
                return -1;
            assert(confirmQueue.size() == 1);
            SendframePacket((unsigned char *)&confirmQueue.front()
                            confirmQueue.front().size);
            return 0;
        }
        case MSG_TYPE_SEND:
        {
            frame sendframe;
            memcpy( (void *)&sendframe.head
                    (void *)pBuffer
                    bufferSize );
            sendframe.size = bufferSize;

            if ( waitQueue.empty

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      10322  2012-09-06 14:44  labs\lab01.cpp

     文件       6621  2012-09-06 14:44  labs\lab02.cpp

     文件       6510  2012-09-06 14:44  labs\lab03.cpp

     文件       5204  2012-09-06 14:44  labs\lab04.cpp

     文件       7137  2012-09-06 14:41  labs\lab05.cpp

     文件      13459  2012-09-06 14:44  labs\lab06.cpp

     文件      18633  2012-09-06 14:43  labs\lab07.cpp

     文件      10256  2012-09-06 14:44  labs\lab08.cpp

     文件       6606  2012-06-12 14:35  labs\lab09.cpp

     目录          0  2012-09-07 18:42  labs

----------- ---------  ---------- -----  ----

                84748                    10


评论

共有 条评论