📄 server.cpp
字号:
#include "protocol.h"
int main(int argc,char ** argv)
{
seq_nr frame_expected;//接收状态变量
bool check,control;
frame r,s; //接受帧和发送帧
event_type event;
int recvnum;
SOCKET sersock,consock;//定义监听接口和会话接口
char buff[1500];
int num;
bool setser; //返回设置服务器是否成功
setser=set_server(&sersock,&consock);
if (setser)
printf("set server sucessfully!\n");
else
{
printf("set server error!\n");
return 0;
}
//接收端开始工作
frame_expected=0; //初始化接收状态变量
control=true;
do
{
printf("\n-------------------\n");
wait_for_event(consock,event);
//检测到有数据到达
if (event==frame_arrival)
{
printf("frame arrival!\n");
//接收数据
recvnum=from_physical_layer(consock,r);
//检查对方是否工作正常
if(recvnum==-1)
{
control=false;
printf("the sender has closed!\n");
break;
}
printf("the frame that we received is :%d%d%s%d\n",r.kind,r.seq,r.info.data,r.checksum);
//接收到序号正确的数据帧
if (r.seq==frame_expected)
{
check=examine_checksum(r); //检验效验和
switch(check)
{
//经过检查传输有错,发送一个否认帧
case false:
printf("Data received occur error!,a NAK will be send!\n");
s.kind=nak;
s.seq=1-s.seq;
s.ack=frame_expected;
s.info.data[0]='\0';//数据域为空
s.checksum=0; //效验和设为0
break;
//数据正确无误,发送一个确认帧
case true:
num=0;
printf("Data received successfully,a ACK will be send!\n");
sprintf( buff,"%d%d%s%d\n",r.kind,r.seq,r.info.data,r.checksum );
printf("%s","0x");
while(buff[num]!='\0')
{
printf("%x ",buff[num]);
num++;
}
printf("\r\n");
to_network_layer(r.info);//向网络层上交接收到的数据
inc(frame_expected); //更新状态变量
s.kind=ack;
s.seq=1-s.seq;
s.ack=frame_expected;
s.info.data[0]='\0';//数据域为空
s.checksum=0; //效验和设为0
}//end switch
}
else //收到的数据序号不是接收方所需要的
{
//发送一个确认帧
printf("The number of this data is not we want, but we still send a ACK!\n");
s.kind=ack;
s.seq=1-s.seq;
s.ack=frame_expected;
s.info.data[0]='\0';//数据域为空
s.checksum=0; //效验和设为0
}
to_physical_layer(consock,s);
}//endif (event==frame_arrival)
}while(control);
closesocket(sersock);
closesocket(consock);
WSACleanup();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -