📄 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;//定义监听接口和会话接口
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;
char buff[1500];
int num;
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);
check=examine_checksum (r);
if (!check)
printf("The data received is occur error! And will drop!\n");
//接收到序号正确的数据帧
if ((r.seq==frame_expected)&&check)
{
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=0;
s.ack=frame_expected;
s.info.data[0]='\0';//数据域为空
s.checksum=0; //效验和设为0
printf("the number of ack is :%d\n",s.ack);
// Sleep(1000);
to_physical_layer(consock,s);
}
else
{
//收到的帧不是所要的,但也要向发送端发送一个确认号
s.kind=ack;
s.seq=0;
s.ack=frame_expected;
s.info.data[0]='\0';//数据域为空
s.checksum=0; //效验和设为0
printf("the number of ack is :%d\n",s.ack);
//Sleep(1000);
to_physical_layer(consock,s);
}
}
}while(control);
shutdown(sersock,0);
shutdown(consock,0);
closesocket(sersock);
closesocket(consock);
WSACleanup();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -