详细设计说明书草稿.docx

上传人:b****6 文档编号:7083040 上传时间:2023-01-17 格式:DOCX 页数:31 大小:43.52KB
下载 相关 举报
详细设计说明书草稿.docx_第1页
第1页 / 共31页
详细设计说明书草稿.docx_第2页
第2页 / 共31页
详细设计说明书草稿.docx_第3页
第3页 / 共31页
详细设计说明书草稿.docx_第4页
第4页 / 共31页
详细设计说明书草稿.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

详细设计说明书草稿.docx

《详细设计说明书草稿.docx》由会员分享,可在线阅读,更多相关《详细设计说明书草稿.docx(31页珍藏版)》请在冰豆网上搜索。

详细设计说明书草稿.docx

详细设计说明书草稿

 

课表查询系统

详细设计说明书

 

项目名称:

课表查询系统

指导老师:

穆海伦

第一作者:

吴灶民13055235

小组成员:

陈路13055310

杨维东13055237

李晨阳13055318

完成日期:

2016/7/12

 

界面设计

教师端界面

实现的功能有:

1.教师登录

2.选课信息的添加和删除

3.特定学生课表查询

4.所有课程信息查询

5.某一课程选课人数

6.统计某一学生的所有选课信息

7.统计某一课程的所有学生信息

 

学生端界面

实现的功能有:

1.学生登录

2.学生个人课表查询

数据包的结构体及各种宏定义

 

#definePKT_LOGIN_11

#definePKT_LOGIN_22

#definePKT_LOGINREPLY3

#definePKT_STUDENT_SEARCH4

#definePKT_STUDENT_REPLY5

#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

{

charCname[10];

charCtime[50];

charTeacherName[10];

charCplace[10];

inttime;

intweek;

}CourseTable;

typedefstructPktHeader

{

intpktType;

}PktHeader;

typedefstructLoginPkt_1//学生端登陆包

{

PktHeaderheader;

intSNo;

charpassword[20];

}LoginPkt_1;

typedefstructLoginPkt_2//教务端登录包

{

PktHeaderheader;

intTNo;

charpassword[20];

}LoginPkt_2;

typedefstructLoginReplyPkt//登陆对应

{

PktHeaderheader;

intret;

}LoginReplyPkt;

typedefstructStudentSearchPkt//学生端课表查询请求

{

PktHeaderheader;

intSNo;

intyear;

intterm;

}StudentSearchPkt;

typedefstructStudentReplyPkt//学生端课表查询回应

{

PktHeaderheader;

Coursecourse;

}StudentReplyPkt;

typedefstructAddPkt//教务端课表信息添加

{

PktHeaderheader;

intSNo;

charCNo[10];////////////////////////////////////修改处

}AddPkt;

typedefstructDeletePkt//教务端课表信息删除

{

PktHeaderheader;

intSNo;

charCNo[10];///////////////////////////修改处

}DeletePkt;

////////////////////////////////

typedefstructAddReplyPkt

{

PktHeaderheader;

intis_success;

}AddReply;

typedefstructDeleteReplyPkt

{

PktHeaderheader;

intis_success;

}DeleteReplyPkt;

//////////////////////////////

//教务端课表查询请求和回应包

typedefstructCountPkt

{

PktHeaderheader;

charCno[10];

intSno;

}CountPkt;

typedefstructCountReplyPkt

{

PktHeaderheader;

intnum;

intis_success;

}CountReplyPkt;

//教务端统计请求和回应包

typedefstructShowPkt

{

PktHeaderheader;

}ShowPkt;

typedefstructShowReplyPkt

{

PktHeaderheader;

Coursecourse;

}ShowReplyPkt;

typedefstructCourseStudentPkt

{

PktHeaderheader;

charCNo[10];

}CourseStudentReply;

typedefstructCourseStudentReplyPkt

{

PktHeaderheader;

charCNo[10];

charCName[10];

intSNo;

charSName[10];

intis_success;

}CourseStudentReplyPkt;

typedefstructStudentTablePkt

{

PktHeaderheader;

intSNo;

intyear;

intterm;

}StudentTablePkt;

typedefstructStudentTableReplyPkt

{

PktHeaderheader;

Coursecourse;

}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);

sendto(m_hSocket,(char*)(&pkt),8+strlen(pkt.CNo),0,(structsockaddr*)(&m_srvAddr),sizeof(sockaddr_in));

接收服务器的反馈信息,判定是否添加成功

recvfrom(m_hSocket,recvbuff,sizeof(recvbuff),0,(structsockaddr*)(&m_srvAddr),&len);

 

查询功能

收集输入框中的信息并发送给服务器端

CountPktpkt;

pkt.header.pktType=PKT_COUNT;

pkt.Sno=SNo_Search;

strcpy(pkt.Cno,(LPCTSTR)CNo_Search);

sendto(m_hSocket,(char*)(&pkt),sizeof(CountPkt),0,(structsockaddr*)(&m_srvAddr),sizeof(sockaddr_in));

接收服务器的反馈信息,把反馈回来的信息分情况处理在界面呈现

recvfrom(m_hSocket,recvbuff,sizeof(recvbuff),0,(structsockaddr*)(&m_srvAddr),&len);

CountReplyPkt*pkt2=(CountReplyPkt*)recvbuff;

统计选课人数

if(strlen((LPCTSTR)CNo_Search)!

=0)

{

AppendMsg("\r\n");

AppendMsg("人选");

chark[10]={0};

itoa(pkt2->num,k,10);

AppendMsg(k);

AppendMsg("有");

AppendMsg(CNo_Search);

AppendMsg("课程");

AppendMsg("\r\n");

}

统计某一个学生选课数量

if(SNo_Search!

=0)

{

AppendMsg("\r\n");

AppendMsg("门课");

chark[10]={0};

itoa(pkt2->num,k,10);

AppendMsg(k);

AppendMsg("选了");

chard[10]={0};

itoa(SNo_Search,d,10);

AppendMsg(d);

AppendMsg("学生");

AppendMsg("\r\n");

}

查询课程信息

if(pkt2->header.pktType==PKT_SHOW_REPLY)

{

charstr[10];

sprintf(str,"%f",pkt2->course.credit);

AppendMsg("\r\n");

chark[10]={0};

itoa(pkt2->course.Chour,k,10);

AppendMsg(k);

AppendMsg("每周学时:

");

AppendMsg("");

chard[10]={0};

itoa(pkt2->course.Cterm,d,10);

AppendMsg(d);

AppendMsg("学期:

");

AppendMsg("");

charm[10]={0};

itoa(pkt2->course.Cyear,m,10);

AppendMsg(m);

AppendMsg("学年:

");

AppendMsg("");

AppendMsg(pkt2->course.Cplace);

AppendMsg("");

AppendMsg(pkt2->course.Ctime);

AppendMsg("");

AppendMsg(pkt2->course.TeacherName);

AppendMsg("");

AppendMsg(str);;

AppendMsg("学分:

");

AppendMsg("");

AppendMsg(pkt2->course.Ctype);

AppendMsg("");

AppendMsg(pkt2->course.Cno);

AppendMsg("");

AppendMsg("课程号:

");

AppendMsg(pkt2->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;创建本地实体

memset(&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

{

LoginReplyPktreply;

reply.header.pktType=PKT_LOGINREPLY;

reply.ret=1;//0failure;1success;

sendto(s,(char*)(&reply),8,0,clientAddr,sizeof(structsockaddr));

}

}

当类型为教师登录

elseif(pktType==PKT_LOGIN_2)

{

LoginPkt_2*pkt=(LoginPkt_2*)recvBuff;

intTno=10000;

charTpassword[20]="123456";

if(pkt->TNo!

=Tno||strcmp(pkt->password,Tpassword)!

=0)

{

LoginReplyPktreply;

reply.header.pktType=PKT_LOGINREPLY;

reply.ret=0;//0failure;1success

sendto(s,(char*)(&reply),8,0,clientAddr,sizeof(structsockaddr));

return;

}

else

{

LoginReplyPktreply;

reply.header.pktType=PKT_LOGINREPLY;

reply.ret=1;//0failure;1success;

sendto(s,(char*)(&reply),8,0,clientAddr,sizeof(structsockaddr));

}

}

当类型为学生查询

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->SNo,pkt->CNo,s,addreplypkt,clientAddr);

}

当类型为选课删除

elseif(pktType==PKT_DELETE)

{

DeletePkt*pkt=(DeletePkt*)recvBuff;

DeleteReplyPktdeletereplypkt={0};

deletereplypkt.header.pktType=PKT_DELETE_REPLY;

DeleteStudentCourse(pkt->SNo,pkt->CNo,s,deletereplypkt,clientAddr);

}

当类型为统计

elseif(pktType==PKT_COUNT)

{

CountPkt*pkt=(CountPkt*)recvBuff;

CountReplyPktcountreplypkt={0};

countreplypkt.header.pktType=PKT_COUNT_REPLY;

Count(pkt->SNo,pkt->CNo,s,countreplypkt,clientAddr);

}

当类型为课程查询

elseif(pktType==PKT_SHOW){

ShowPkt*pkt=(ShowPkt*)recvBuff;

ShowReplyPktshowreplypkt={0};

sh

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1