详细设计说明书草稿Word文档格式.docx
- 文档编号:20175346
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:31
- 大小:43.52KB
详细设计说明书草稿Word文档格式.docx
《详细设计说明书草稿Word文档格式.docx》由会员分享,可在线阅读,更多相关《详细设计说明书草稿Word文档格式.docx(31页珍藏版)》请在冰豆网上搜索。
#definePKT_ADD6
#definePKT_DELETE7
#definePKT_ADD_REPLY8
#definePKT_DELETE_REPLY9
#definePKT_COUNT10
#definePKT_COUNT_REPLY11
#definePKT_SHOW12
#definePKT_SHOW_REPLY13
#definePKT_COURSE_STUDENT14
#definePKT_COURSE_STUDENT_REPLY15
#definePKT_STUDENT_TABLE16
#definePKT_STUDENT_TABLE_REPLY17
typedefstructCourse
{
charCno[10];
charCname[10];
charCtype[10];
doublecredit;
charTeacherName[10];
charCtime[50];
charCplace[10];
intCyear;
intCterm;
intChour;
}Course;
typedefstructCourseTable
inttime;
intweek;
}CourseTable;
typedefstructPktHeader
intpktType;
}PktHeader;
typedefstructLoginPkt_1//学生端登陆包
PktHeaderheader;
intSNo;
charpassword[20];
}LoginPkt_1;
typedefstructLoginPkt_2//教务端登录包
intTNo;
}LoginPkt_2;
typedefstructLoginReplyPkt//登陆对应
intret;
}LoginReplyPkt;
typedefstructStudentSearchPkt//学生端课表查询请求
intSNo;
intyear;
intterm;
}StudentSearchPkt;
typedefstructStudentReplyPkt//学生端课表查询回应
Coursecourse;
}StudentReplyPkt;
typedefstructAddPkt//教务端课表信息添加
charCNo[10];
////////////////////////////////////修改处
}AddPkt;
typedefstructDeletePkt//教务端课表信息删除
///////////////////////////修改处
}DeletePkt;
////////////////////////////////
typedefstructAddReplyPkt
intis_success;
}AddReply;
typedefstructDeleteReplyPkt
}DeleteReplyPkt;
//////////////////////////////
//教务端课表查询请求和回应包
typedefstructCountPkt
intSno;
}CountPkt;
typedefstructCountReplyPkt
intnum;
}CountReplyPkt;
//教务端统计请求和回应包
typedefstructShowPkt
}ShowPkt;
typedefstructShowReplyPkt
}ShowReplyPkt;
typedefstructCourseStudentPkt
}CourseStudentReply;
typedefstructCourseStudentReplyPkt
charCName[10];
charSName[10];
}CourseStudentReplyPkt;
typedefstructStudentTablePkt
}StudentTablePkt;
typedefstructStudentTableReplyPkt
}StudentTableReplyPkt;
功能实现
登录功能:
使用socket套接字也服务器建立UDP连接
WSADATAwsaData;
WSAStartup(MAKEWORD(2,2),&
wsaData);
m_hSocket=socket(AF_INET,SOCK_DGRAM,0);
memset(&
m_srvAddr,0,sizeof(structsockaddr_in));
m_srvAddr.sin_family=AF_INET;
m_srvAddr.sin_addr.s_addr=inet_addr((LPCTSTR)"
192.168.1.103"
);
m_srvAddr.sin_port=htons(8888);
约定使用8888端口
将登录信息发送给服务器
sendto(m_hSocket,(char*)(&
pkt),8+strlen(pkt.password),0,(structsockaddr*)(&
m_srvAddr),sizeof(sockaddr_in));
接收服务器端的反馈信息,判定是否为合法用户
recvfrom(m_hSocket,recvbuff,sizeof(recvbuff),0,(structsockaddr*)(&
m_srvAddr),&
len);
添加修改功能
收集输入框中的信息并发送给服务器端
AddPktpkt;
pkt.header.pktType=PKT_ADD;
pkt.SNo=SNo;
strcpy(pkt.CNo,(LPCTSTR)CNo);
pkt),8+strlen(pkt.CNo),0,(structsockaddr*)(&
接收服务器的反馈信息,判定是否添加成功
查询功能
CountPktpkt;
pkt.header.pktType=PKT_COUNT;
pkt.Sno=SNo_Search;
strcpy(pkt.Cno,(LPCTSTR)CNo_Search);
pkt),sizeof(CountPkt),0,(structsockaddr*)(&
m_srvAddr),sizeof(sockaddr_in));
接收服务器的反馈信息,把反馈回来的信息分情况处理在界面呈现
m_srvAddr),&
CountReplyPkt*pkt2=(CountReplyPkt*)recvbuff;
统计选课人数
if(strlen((LPCTSTR)CNo_Search)!
=0)
{
AppendMsg("
\r\n"
人选"
chark[10]={0};
itoa(pkt2->
num,k,10);
AppendMsg(k);
有"
AppendMsg(CNo_Search);
课程"
}
统计某一个学生选课数量
if(SNo_Search!
门课"
选了"
chard[10]={0};
itoa(SNo_Search,d,10);
AppendMsg(d);
学生"
查询课程信息
if(pkt2->
header.pktType==PKT_SHOW_REPLY)
{
charstr[10];
sprintf(str,"
%f"
pkt2->
course.credit);
AppendMsg("
chark[10]={0};
itoa(pkt2->
course.Chour,k,10);
AppendMsg(k);
每周学时:
"
chard[10]={0};
course.Cterm,d,10);
AppendMsg(d);
学期:
charm[10]={0};
course.Cyear,m,10);
AppendMsg(m);
学年:
AppendMsg(pkt2->
course.Cplace);
course.Ctime);
course.TeacherName);
AppendMsg(str);
;
学分:
course.Ctype);
course.Cno);
课程号:
course.Cname);
}
服务器端功能实现
在服务器端开启时加载已有的用户信息
boolLoadDB(constchar*DBName);
判定客户端发送的登录信息是否合法
boolIsValidUser(constintname,constchar*password);
学生查询功能实现
voidStudentSearch(constintSNo,constintyear,constintterm,SOCKETs,StudentReplyPktpkt,structsockaddr*clientAddr);
添加选课信息
voidAddStudentCourse(constintSNo,constcharCNo[10],SOCKETs,AddReplyPktpkt,structsockaddr*clientAddr);
删除选课信息
voidDeleteStudentCourse(constintSNo,constcharCNo[10],SOCKETs,DeleteReplyPktpkt,structsockaddr*clientAddr);
统计人数
voidCount(constintSNo,constcharCNo[10],SOCKETs,CountReplyPktpkt,structsockaddr*clientAddr);
查询个人课表
voidStudentTable(constintSNo,constintyear,constintterm,SOCKETs,StudentTableReplyPktpkt,structsockaddr*clientAddr);
查询某一课程的学生信息
voidCourseStudent(constcharCNo[10],SOCKETs,CourseStudentReplyPktpkt,structsockaddr*clientAddr);
接收来自客户端数据包,分析其需要的服务并调用相应的功能函数
voidProcessPkt(constchar*recvBuff,SOCKETs,structsockaddr*clientAddr);
intmain(intargc,char*argv[])
LoadDB("
SchoolSystem"
用户信息初始化
WSADATAwsaData;
WSAStartup(MAKEWORD(2,2),&
wsaData);
SOCKETsListen=socket(AF_INET,SOCK_DGRAM,0);
创建socket
sockaddr_inlocal;
创建本地实体
local,0,sizeof(local));
local.sin_family=AF_INET;
local.sin_addr.s_addr=INADDR_ANY;
local.sin_port=htons((u_short)8888);
循环接收数据包
while(true)
{
intret=recvfrom(sListen,recvBuff,sizeof(recvBuff),0,
(structsockaddr*)&
clientAddr,&
clientAddrLen);
ProcessPkt(recvBuff,sListen,(structsockaddr*)&
clientAddr);
}
closesocket(sListen);
退出时关闭socket
return0;
}
voidProcessPkt(constchar*recvBuff,SOCKETs,structsockaddr*clientAddr)
intpktType=((PktHeader*)recvBuff)->
pktType;
对数据进行识别
当类型为学生登录
if(pktType==PKT_LOGIN_1)
LoginPkt_1*pkt=(LoginPkt_1*)recvBuff;
if(!
IsValidUser(pkt->
SNo,pkt->
password))判定是否合法
LoginReplyPktreply;
reply.header.pktType=PKT_LOGINREPLY;
reply.ret=0;
//0failure;
1success
sendto(s,(char*)(&
reply),8,0,clientAddr,sizeof(structsockaddr));
return;
else
reply.ret=1;
1success;
当类型为教师登录
elseif(pktType==PKT_LOGIN_2)
{
LoginPkt_2*pkt=(LoginPkt_2*)recvBuff;
intTno=10000;
charTpassword[20]="
123456"
if(pkt->
TNo!
=Tno||strcmp(pkt->
password,Tpassword)!
当类型为学生查询
elseif(pktType==PKT_STUDENT_SEARCH)
StudentSearchPkt*pkt=(StudentSearchPkt*)recvBuff;
StudentReplyPktstudentreplypkt={0};
studentreplypkt.header.pktType=PKT_STUDENT_REPLY;
StudentSearch(pkt->
SNo,pkt->
year,pkt->
term,s,studentreplypkt,clientAddr);
当类型为选课添加
elseif(pktType==PKT_ADD)
AddPkt*pkt=(AddPkt*)recvBuff;
AddReplyPktaddreplypkt={0};
addreplypkt.header.pktType=PKT_ADD_REPLY;
AddStudentCourse(pkt->
CNo,s,addreplypkt,clientAddr);
当类型为选课删除
elseif(pktType==PKT_DELETE)
DeletePkt*pkt=(DeletePkt*)recvBuff;
DeleteReplyPktdeletereplypkt={0};
deletereplypkt.header.pktType=PKT_DELETE_REPLY;
DeleteStudentCourse(pkt->
CNo,s,deletereplypkt,clientAddr);
当类型为统计
elseif(pktType==PKT_COUNT)
{
CountPkt*pkt=(CountPkt*)recvBuff;
CountReplyPktcountreplypkt={0};
countreplypkt.header.pktType=PKT_COUNT_REPLY;
Count(pkt->
CNo,s,countreplypkt,clientAddr);
当类型为课程查询
elseif(pktType==PKT_SHOW){
ShowPkt*pkt=(ShowPkt*)recvBuff;
ShowReplyPktshowreplypkt={0};
sh
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 详细 设计 说明书 草稿