软件课程设计报告.docx
《软件课程设计报告.docx》由会员分享,可在线阅读,更多相关《软件课程设计报告.docx(19页珍藏版)》请在冰豆网上搜索。
![软件课程设计报告.docx](https://file1.bdocx.com/fileroot1/2022-11/22/9ae249a5-ea75-4aec-ae12-dc017f09e814/9ae249a5-ea75-4aec-ae12-dc017f09e8141.gif)
软件课程设计报告
北京科技大学
软件课程设计报告
——C语言
班级:
姓名:
学号:
指导教师:
日期:
2012年9月7日
目录
1设计内容1
2应用程序总体分析与设计1
3应用程序各功能模块分析与设计1
3.1功能模块1
3.1.11
3.1.2……..……………………………………………………………………1
3.1.3…………………………………………………………………………..2
3.2模块流程图2
3.3程序结构图3
4程序测试3
4.1测试过程4
4.1.1VS2010截图4
4.2测试结果5
4.2.1服务器端截图5
4.2.2客户器端截图6
5程序文档7
5.1使用说明7
5.2程序说明7
6程序源代码7
1设计内容
通过C语言编程实现一个局域网聊天程序,包括服务器端程序和客户端程序,程序能够实现两台主机或多台主机间的基本通信。
高级功能包括用户注册、信息校检,能够存储聊天记录,能够实现多人聊天。
2应用程序总体分析与设计
C程序的编写和调试在VisualStudio2010集成开发环境中完成。
通信协议选择TCP,利用WinSockAPI函数完成网络通信。
进行题目分析,包括数据分析和功能分析,作为应用程序设计的依据。
总体设计就是根据功能分析,采用自顶向下的方法确定应用系统的总体结构,进行模块划分并确定各模块功能;模块设计就是按照功能模块使用数据流程图、N-S结构图等描述工具进行模块程序设计;然后对各模块进行编程并上机调试,完成整个系统的开发。
3应用程序各功能模块分析与设计
3.1功能模块
3.1.1身份识别与注册
3.1.2实现两人或三人聊天
3.1.2.1套接口与连接的建立
打开Winsock---WSAStartup();创建套接口----socket()或WSASocket();指定本地地址------bind();监听连接-------listen();请求连接-----connect()或WSAConnect();接受连接-----accept()或WSAAccept();
3.1.2.2数据传输
在已建立连接的套接口上发送数据-----send()或WSASend();在已建立连接的套接口上接收数据----recv()或WSARecv()
3.1.2.3连接与套接口的关闭
关闭读写通道-----shutdown();关闭套接口----closesocket();终止使用Winsock----WSACleanup()
3.1.3查看历史数据
3.2模块流程图
3.3程序结构图
4程序测试
4.1测试过程
4.1.1VS2010截图
4.2测试结果
4.2.1服务器端截图
4.2.2客户器端截图
5程序文档
5.1使用说明
程序的功能为实现用户注册,用户登录,一对一聊天,一对多聊天;运行环境为visualstudio2010;使用说明:
用户先运行服务器端,根据需要选择用户登录或用户注册,一对一还是一对二聊天,创建好已连接的套接口后等待客户端发出请求。
此时运行客户端,按要求输入用户名和密码后会出现【欢迎使用局域网聊天系统!
】的提示,此时即可进行对话交流。
5.2程序说明
本程序的身份识别与注册模块,用一些二维数组存放用户名和密码,然后与用户输入的用户名与密码进行匹配,若成功则可进行下一步。
本程序的主要部分是信息交流部分,分为套接口与连接的建立、数据传输、连接与套接口的关闭。
本程序还有一个功能是存储数据,每当交流十句时,便会有选择查看记录还是继续会话。
6程序源代码
服务器:
#include
#include
#include
#include
#include
#pragmacomment(lib,"ws2_32.lib")
voidmain()
{
chartime[128];
charmima[7]={"0"};
charyonghuming[16]={"0"};
charcunchu[100][100]={"0"};
inta=0,b=0,r=0,t=0,d=0,e=0;
inti=0,j=3,k=0,m=0,n=0,p=0;
chars=0;
charyuanmima[100][7]={"123456"};
charyuanyonghuming[100][16]={"123456"};
SOCKETs1;//创建套接字
structsockaddr_intcpaddr;//与指定协议有关的地址结构指针
charip_addr[16]={"0"};//存放主机的IP地址的数组
intisockErr;//绑定失败后所用指针
intport1=5000,port2=5500;//端口号
structsockaddr_inclientsocket;//存放连接客户的IP地址的地址结构指针
intlen;//客户IP地址结构的长度
SOCKETserConn;//已连接套接口
charreceiveBuf[100];//用于接收数据的缓冲区
charsendBuf[100];//发送数据字符缓冲区
SOCKETs2;//创建套接字
structsockaddr_intcpaddr2;//与指定协议有关的地址结构指针
charip_addr2[16]={"0"};//存放主机的IP地址的数组
intisockErr2;//绑定失败后所用指针
structsockaddr_inclientsocket2;//存放连接客户的IP地址的地址结构指针
intlen2;//客户IP地址结构的长度
SOCKETserConn2;//已连接套接口
charreceiveBuf2[100];//用于接收数据的缓冲区
charsendBuf2[100];//发送数据字符
WORDwVersionRequested;//打开Winsock
WSADATAwsaData;
wVersionRequested=MAKEWORD(2,2);
if(!
WSAStartup(wVersionRequested,&wsaData))
{
printf("已打开套接字\n");
}
else
{
printf("嵌套字未打开!
");
return;
}
printf("/-----------------新用户注册请按1,用户登陆请按0----------------------/\n");
scanf("%d",&a);
getchar();
if(a)
{
for(r=0;r<=10;r++)
{
printf("请输入新用户名:
");
gets(yuanyonghuming[r]);
//scanf("%s",&yuanyonghuming)
printf("请输入新密码:
");
gets(yuanmima[r]);
//scanf("%s",&yuanmima);
printf("【亲爱的%s",yuanyonghuming[r]);
printf("恭喜注册成功!
!
!
】\n\n");
printf("【继续注册请按1登陆请按0】\n");
scanf("%c",&s);
getchar();
if(s=='0')
break;
}
}
while
(1)
{
printf("请输入用户名:
");
gets(yonghuming);
printf("\n请输入六位密码:
");
gets(mima);
for(t=0;t<=10;t++)
{
d=strcmp(mima,yuanmima[t])==0&&strcmp(yonghuming,yuanyonghuming[t])==0;
switch(d)
{
case0:
e=0;break;
case1:
e=1;gotobiaozhi;
}
}
biaozhi:
if(e)
{
printf("\n\n【欢迎使用局域网聊天系统!
】\n");
printf("【与一人聊天请按0与两人聊天请按1】");
scanf("%d",&p);
getchar();
s1=socket(AF_INET,SOCK_STREAM,0);//先创建一个使用IP地址族的流式套接口
tcpaddr.sin_family=AF_INET;//以下给结构类型的地址提供数值
tcpaddr.sin_port=htons(port1);//htons()函数把一个14位主机字节顺序的端口号转化为网络字节顺序
tcpaddr.sin_addr.s_addr=htonl(INADDR_ANY);//htons()函数把一个32位主机字节顺序的IP地址转化为网络字节顺序
if(bind(s1,(LPSOCKADDR)&tcpaddr,sizeof(tcpaddr))==SOCKET_ERROR)
{
isockErr=WSAGetLastError();//该函数调用失败,进行错误处理
return;
}
else
{
printf("绑定完成\n");//绑定完成
}
//调用函数成功,进行其他处理
if(listen(s1,1000)==0)//其中第二个参数代表能够接收的最多的连接数
{
printf("监听成功\n");
}
else
{
printf("SOCKET_ERROR");
}
//开始进行监听
serConn=socket(AF_INET,SOCK_STREAM,0);//创建了可识别套接字
printf("创建了已连接套借口\n");
len=sizeof(clientsocket);
if(p)
len2=sizeof(clientsocket2);
serConn=accept(s1,(LPSOCKADDR)&clientsocket,&len);//如果这里不是accept而是conection的话。
。
就会不断的监听
if(p)
serConn2=accept(s1,(LPSOCKADDR)&clientsocket2,&len2);//如果这里不是accept而是conection的话。
。
就会不断的监听
while
(1)
{
apple:
for(b=0;b<=3;b++)
{
recv(serConn,receiveBuf,100,0);
strcpy(cunchu[k],receiveBuf);
k++;
//send(serConn,"serve:
OK",strlen("serve:
OK")+1,0);
printf("\n客户端1:
%s\n\n",receiveBuf);
_strtime(time);
printf("----------------------------------------------------time:
%s\n",time);
if(p)
{recv(serConn2,receiveBuf2,100,0);
strcpy(cunchu[k],receiveBuf2);
k++;
printf("\n客户端2:
%s\n\n",receiveBuf2);
_strtime(time);
printf("----------------------------------------------------time:
:
%s\n\n",time);
}
printf("请输入想要说的话:
");
gets(sendBuf);
_strtime(time);
printf("\n----------------------------------------------------time:
%s\n",time);
strcpy(cunchu[k],sendBuf);
k++;
send(serConn,sendBuf,strlen(sendBuf),0);
if(p)
send(serConn2,sendBuf,strlen(sendBuf),0);
}
printf("\n查看通讯记录请按1否则按0\n\n");
scanf("%d",&n);
getchar();
if(n)
gotoloop;
else
gotoapple;
}
loop:
printf("\n/////*\n");
for(m=0;m<=k;m++)
puts(cunchu[m]);
printf("\n*/////\n");
gotoapple;
closesocket(serConn);//关闭
WSACleanup();//释放资源的操作
}
else
{
j--;
printf("用户名或密码错误!
!
!
!
\n\n\n你还有%d次机会\n",j);
i++;
if(i>=3)
break;
}
}
system("pause");
}
客户端:
#include
#include
#include
#include
#include
#pragmacomment(lib,"ws2_32.lib")
voidmain()
{
chartime[128];
charmima[7]={"0"};
charyonghuming[16]={"0"};
charcunchu[100][100]={"0"};
inta=0,b=0,r=0,t=0,d=0,e=0;
inti=0,j=3,k=0,m=0,n=0;
chars=0;
charyuanmima[100][7]={"123456"};
charyuanyonghuming[100][16]={"123456"};
SOCKETkehuSocket;
structsockaddr_inkehuSocket_in;
charip_addr[16]={"127.0.0.1"};
charreceiveBuf[100]={"0"};
charspeak[100];
WORDwVersionRequested;//打开Winsock
WSADATAwsaData;
wVersionRequested=MAKEWORD(2,2);
if(!
WSAStartup(wVersionRequested,&wsaData))
{
printf("已打开套接字\n");
}
else
{
printf("嵌套字未打开!
");
return;
}
printf("/*********新用户注册请按1,用户登陆请按0**********/\n");
scanf("%d",&a);
getchar();
if(a)
{
for(r=0;r<=10;r++)
{
printf("请输入新用户名:
");
gets(yuanyonghuming[r]);
//scanf("%s",&yuanyonghuming)
printf("请输入新密码:
");
gets(yuanmima[r]);
//scanf("%s",&yuanmima);
printf("亲爱的%s",yuanyonghuming[r]);
printf("恭喜注册成功!
!
!
\n\n");
printf("继续注册请按1登陆请按0\n");
scanf("%c",&s);
getchar();
if(s=='0')
break;
}
}
while
(1)
{
printf("请输入用户名:
");
gets(yonghuming);
printf("\n请输入六位密码:
");
gets(mima);
for(t=0;t<=10;t++)
{
d=strcmp(mima,yuanmima[t])==0&&strcmp(yonghuming,yuanyonghuming[t])==0;
switch(d)
{case0:
e=0;break;
case1:
e=1;gotobiaozhi;
}
}
biaozhi:
if(e)
{printf("\n\n欢迎使用局域网聊天系统!
\n");
kehuSocket=socket(AF_INET,SOCK_STREAM,0);
printf("请输入主机IP:
\n");
//gets(ip_addr);
scanf("%s",ip_addr);
getchar();
kehuSocket_in.sin_family=AF_INET;
kehuSocket_in.sin_addr.s_addr=inet_addr(ip_addr);
kehuSocket_in.sin_port=htons(5000);
//bind(clientSocket,(sockaddr*)&clientsock_in,strlen(sockaddr));//注意第三个参数
//listen(clientSocket,5);
if(connect(kehuSocket,(LPSOCKADDR)&kehuSocket_in,sizeof(kehuSocket_in)))//开始连接
{printf("与服务器连接出错");
system("pause");
}
else
{
printf("开始连接,请稍候.....\n");
}
while
(1)
{
apple:
for(b=0;b<=3;b++)
{
printf("请输入想要说的话:
");
gets(speak);
_strtime(time);
printf("\n----------------------------------------------------time:
%s\n",time);
strcpy(cunchu[k],speak);
k++;
send(kehuSocket,speak,100,0);
recv(kehuSocket,receiveBuf,100,0);
strcpy(cunchu[k],receiveBuf);
printf("\n服务器:
%s\n\n",receiveBuf);
_strtime(time);
printf("----------------------------------------------------time:
%s\n\n",time);
k++;
}
printf("\n查看通讯记录请按1否则按0\n\n");
scanf("%d",&n);
getchar();
if(n)
gotoloop;
else
gotoapple;
}
loop:
printf("\n/////*\n");
for(m=0;m<=k;m++)
puts(cunchu[m]);
printf("\n*/////\n");
gotoapple;
closesocket(kehuSocket);//关闭
WSACleanup();//释放资源的操作
}
else
{
j--;
printf("用户名或密码错误!
!
!
!
\n\n\n你还有%d次机会\n",j);
i++;
if(i>=3)
break;
}
}
system("pause");
}