资源简介
计网实验 数据链路层实验 源代码 C语言实现 选择重传协议
代码片段和文件信息
#include
#include
#include “protocol.h“
#include “datalink.h“
#define MAX_SEQ 31
#define DATA_TIMER 3800//calculagraph timer
#define ACK_TIMER 1100
#define NR_BUFS 16 //windows number
#define inc(k)if(k
typedef enum{falsetrue}bool;
typedef unsigned char seq_nr;//sequence or ack number
typedef struct{
unsigned char info[PKT_LEN];
}packet;//packet definition
static int phl_ready = 0;
bool no_nak=true;
typedef struct frame {
unsigned char kind; // frame_DATA
seq_nr ack;//acknowledgement number
seq_nr seq;//sequence number
packet data; //the network layer packet
unsigned int padding;
}frame;
static int between(seq_nr aseq_nr bseq_nr c){
if((a <= b && b < c) || (c < a && a <= b) || (b < c && c < a))
return true;
else
return false;
}
//add crc
static void put_frame(unsigned char *frame int len)
{
*(unsigned int *)(frame + len) = crc32(frame len);
send_frame(frame len + 4);
phl_ready = 0;
}
//send data to physical layer
static void send_data(unsigned char fkseq_nr frame_nrseq_nr frame_expectedpacket buffer[])
{
frame s;
s.kind = fk;
s.seq = frame_nr;//insert sequence number into frame
s.ack = (frame_expected+ MAX_SEQ)%(MAX_SEQ+1);//piggyback ack
if(fk == frame_DATA)
memcpy(s.data.info buffer[frame_nr%NR_BUFS].info PKT_LEN);//insert packet into frame
if(fk == frame_NAK)
no_nak = false; //one nak per frameplease
dbg_frame(“Send DATA %d %d ID %d\n“ s.seq s.ack *(short *)s.data.info);
if (fk == frame_DATA)
put_frame((unsigned char *)&s 3 + PKT_LEN);//put CRC following the frame
if(fk == frame_NAK||fk==frame_ACK)
put_frame((unsigned char *)&s 2);//put CRC following the frame
if(fk == frame_DATA)
start_timer(frame_nr%NR_BUFS DATA_TIMER);
stop_ack_timer();//no need for separate ack frame
}
int main(int argc char **argv){
int eventarglen=0;
int i;//contol the number of circle of arrived
frame r;//scratch variable
seq_nr next_frame_to_send;//the upper of the send‘s window
seq_nr ack_expected;//the lower of the send‘s window
seq_nr frame_expected;//the lower of the reciver‘s window
seq_nr too_far;//the upper of the reciver‘s window
seq_nr nbuffered;//currently window
packet out_buf[NR_BUFS];//buffer for the outbound stream
packet in_buf[NR_BUFS];//buffer for the in stream
bool arrived[NR_BUFS];
enable_network_layer();
//disable_network_layer();//allow netword_layer_ready events
ack_expected = 0;
next_frame_to_send = 0;
frame_expected = 0;
too_far = NR_BUFS;
nbuffered = 0;
for(i = 0;i < NR_BUFS;i++)
arrived[i] = false;
protocol_init(argc argv);
lprintf(“Designed by chenchen_07415_071419 build: “ __DATE__“ “__TIME__“\n\n“);
while(true){
event = wait_for_event(&arg);
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 47509 2009-12-01 14:32 数据链路层—选择性重传协议\datali
文件 59499 2009-12-01 14:32 数据链路层—选择性重传协议\datali
文件 6264 2009-12-01 19:03 数据链路层—选择性重传协议\datali
文件 3476 2009-10-19 16:46 数据链路层—选择性重传协议\datali
文件 524 2009-10-16 10:23 数据链路层—选择性重传协议\datali
文件 176162 2009-12-01 14:02 数据链路层—选择性重传协议\datali
文件 518 2009-10-16 12:34 数据链路层—选择性重传协议\datali
文件 199324 2009-12-01 14:02 数据链路层—选择性重传协议\datali
文件 50176 2009-12-01 14:27 数据链路层—选择性重传协议\datali
文件 48640 2009-12-01 14:27 数据链路层—选择性重传协议\datali
文件 427008 2009-12-01 14:02 数据链路层—选择性重传协议\datali
文件 1516 2009-12-01 14:02 数据链路层—选择性重传协议\datali
文件 94208 2009-10-19 22:57 数据链路层—选择性重传协议\Protocol.dll
文件 1831 2009-10-19 16:46 数据链路层—选择性重传协议\protocol.h
文件 5932 2009-10-19 22:57 数据链路层—选择性重传协议\Protocol.lib
目录 0 2010-01-02 12:54 数据链路层—选择性重传协议
----------- --------- ---------- ----- ----
1122587 16
- 上一篇:有限元的C语言实现计算
- 下一篇:MFC编程案例之文件管理器C++
评论
共有 条评论