软件课程设计报告.docx

上传人:b****5 文档编号:3440149 上传时间:2022-11-23 格式:DOCX 页数:19 大小:337.65KB
下载 相关 举报
软件课程设计报告.docx_第1页
第1页 / 共19页
软件课程设计报告.docx_第2页
第2页 / 共19页
软件课程设计报告.docx_第3页
第3页 / 共19页
软件课程设计报告.docx_第4页
第4页 / 共19页
软件课程设计报告.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

软件课程设计报告.docx

《软件课程设计报告.docx》由会员分享,可在线阅读,更多相关《软件课程设计报告.docx(19页珍藏版)》请在冰豆网上搜索。

软件课程设计报告.docx

软件课程设计报告

 

北京科技大学

软件课程设计报告

——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");

}

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

当前位置:首页 > 小学教育 > 学科竞赛

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

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