北科大小学期软件课程设计报告.docx
- 文档编号:13387247
- 上传时间:2023-06-13
- 格式:DOCX
- 页数:17
- 大小:586.34KB
北科大小学期软件课程设计报告.docx
《北科大小学期软件课程设计报告.docx》由会员分享,可在线阅读,更多相关《北科大小学期软件课程设计报告.docx(17页珍藏版)》请在冰点文库上搜索。
北科大小学期软件课程设计报告
北京科技大学
软件课程设计报告
——C语言
班级:
姓名:
学号:
指导教师:
日期:
目录
1设计内容3
2应用程序总体分析与设计4
3应用程序各功能模块分析与设计4
3.1功能模块4
3.1.1服务器端4
3.1.2客户端4
3.2模块流程图4
3.2.1服务器端流程图4
3.2.2客户端流程图5
3.3程序结构图7
4程序测试8
4.1测试过程8
4.1.1VS2010截图8
4.2测试结果8
4.2.1服务器端截图9
4.2.2客户器端截图9
5程序文档9
5.1使用说明10
5.2程序说明10
6程序源代码11
6.1客户端:
11
6.2服务器端15
1设计内容
通过c语言编程实现一个局域网聊天的程序,包括服务器端程序和客户端的程序,该程序能够实现两台主机之间或多台主机之间的基本通信。
2应用程序总体分析与设计
该程序包括两个部分,一个是服务器端,另一个是客户端。
由于程序要实现两台或多台主机之间的相互通信,这就涉及到了利用c语言进行网络编程。
还有两台或者多台主机之间的网络通信需要用到通信协议,而TCP/IP有两种不同的通信协议,即面向有连接的TCP通信协议和面向无连接的UDP通信协议。
教学要求掌握TCP通信的原理。
所以选择TCP通信协议进行多台主机之间的连接。
服务器端的实现过程:
1、初始化WindowsSocket
2、创建一个监听的Socket
3、设置服务器地址信息,并将监听端口绑定到这个地址上
4、开始监听
5、接受客户端连接
6、和客户端通信
7、结束服务并清理WindowsSocket和相关数据,或者返回第4步
客户端实现的过程:
1、加载套接字库
2、创建套接字
3、请求连接服务器
4、发送数据/接收数据
5、关闭套接字
6、卸载所加载的套接字库。
3应用程序各功能模块分析与设计
3.1功能模块
本程序由两大部分组成,包括服务器端和客户端。
服务器端包含的模块有初始模块、循环控制模块和服务模块;客户端包含的模块有初始化模块、功能控制模块和数据传输控制模块。
3.1.1服务器端
(1)初始化模块用于初始化各个全局变量赋初始值。
初始化Winsock,加载Winsock库。
(2)功能模块控制。
该模块为其他模块提供调用的函数,包括参数获取功能和错误输出功能。
(3)服务模块。
该模块为客户端提供服务功能,包括接收来自客户端的数据,并发送数据到客户端。
3.1.2客户端
(1)初始化模块。
该模块用于初始化客户端的Winsock,加载Winsock库。
(2)功能模块控制。
与服务器端一样,该模块提供了参数获取和错误输出功能。
(3)数据传输控制模块。
该模块控制着整个客户端的数据传输,包括数据发送和接收等。
3.2模块流程图
3.2.1服务器端流程图
服务器端系统流程图所示。
程序首先调用为库文件wsock32.lib使用所需资源。
程序首先调用函数获取用户提供的先项,如果没有提供选项,则直接使用默认值,如果有选项提供并成功获取(选项错误则显示用户帮助并终止程序),则初始化变量和Winsock,并创建TCP流套接字;然后解析主机名(如果选项提供的是IP地址,或者使用是默认值)或者IP地址(如果选项提供的是主机名),解析成功后则设置服务器地址的各个参数,包括地址、IP地址和端口号;接下来将创建的TCP流套接字和设定的服务器地址绑定(调用bind()函数);绑定成功后,则开始用listen()函数侦听客户的连接。
接收客户端请求成功后,进行接收数据、发送数据等操作。
接收数据完毕后,关闭窗口完成通信。
3.2.2客户端流程图
客户端系统流程如图所示。
客户端程序执行时调用库函数获取用户选项,如果获取的选项错误,则终止程序,如果选项正确则开始创建TCP流套接字,成功创建TCP流套接字后则作和服务器类似的操作,即解析主机名或IP地址、设置服务器端地址;然后进行连接服务器操作,若能成功连接则输出连接信息,并发送消息到服务器端;然后接收来自服务器端的响应,(消息),并将接收到的消息输出。
最后关闭套接字和释放占用的资源。
和服务器一样,在操作过程中,任何一步操作失败都将退出程序,并提示错误信息。
否
是
否
是
是
否
是
否
是
否
3.3程序结构图
4程序测试
4.1测试过程
4.1.1VS2010截图
4.2测试结果
4.2.1服务器端截图
4.2.2客户器端截图
5程序文档
5.1使用说明
程序能实现两台主机或多台主机间的基本通信。
运行环境Windows7/XP,运行客户端.exe程序,与服务器端连接上后,即可进行相关数据传输。
但是必须客户端首先发送数据,按Enter结束,数据即发送到服务器端,服务器端即可收到客户端发送的信息。
然后服务器端输入需要发送的数据,按Enter键发送,客户端也可收到相应信息。
5.2程序说明
本程序由两大部分组成,包括服务器端和客户端。
服务器端包含的模块有初始模块、循环控制模块和服务模块;客户端包含的模块有初始化模块、功能控制模块和数据传输控制模块。
服务器端:
(1)初始化模块用于初始化各个全局变量赋初始值。
初始化Winsock,加载Winsock库。
(2)功能模块控制。
该模块为其他模块提供调用的函数,包括参数获取功能和错误输出功能。
(3)服务模块。
该模块为客户端提供服务功能,包括接收来自客户端的数据,并发送数据到客户端。
客户端:
(1)初始化模块。
该模块用于初始化客户端的Winsock,加载Winsock库。
(2)功能模块控制。
与服务器端一样,该模块提供了参数获取和错误输出功能。
(3)数据传输控制模块。
该模块控制着整个客户端的数据传输,包括数据发送和接收等。
程序中主要变量含义:
err:
错误,lenfrom:
接收的字符长度,addSrv.sin_addr.s_addr:
IP地址,ddrSrv.sin_family:
使用的IP地址族,addrSrv_port:
端口号。
数据结构:
运用结构体,用于保存IP地址和端口信息,存储Winsock的最新版本号。
运用数组,用于存储输入的字符数。
下面是关于头文件的说明。
#include
在使用标准函数库中的输入输出函数时,编译系统要求程序提供有关的信息(例如对这些输入输出函数的声明),#include
在程序中用到系统提供的标准函数库中的输入输出函数时,应在程序的开头写上一行:
#include"stdio.h"或者是#include
#include
Winsock是开放的Windows网络编程基础,应用程序通过Winsock的API实现相互之间的通信,而Winsock利用下层的网络通信协议和操作系统调用实现实际的通信工作。
#pragmacomment(lib,"ws2_32.lib"):
这句话的前面意思是静态加入一个lib库文件,ws2_32.lib文件,提供了对以下网络相关API的支持,若使用其中的API,则应该将ws2_32.lib加入工程(否则需要动态载入ws2_32.dll)。
这句话一般出现在网络编程中,需要使用网络API函数的时候,就必须使用这条语句加载ws2_32.lib库或者动态载入ws2_32.dll。
6程序源代码
6.1服务器端:
#include
#include
#pragmacomment(lib,"Ws2_32.lib")
voidmain()
{
WORDwVersionRequested;
WSADATAwsaData;
SOCKETsockS;
SOCKETsockU;
structsockaddr_inaddrS;
inti;
intbytesRecv;
intbytesSent;
charsendBuf[100];
charrecvBuf[100];
wVersionRequested=MAKEWORD(2,2);
if(WSAStartup(wVersionRequested,&wsaData)!
=0){
printf("Winsock初始化错误:
%d\n");
return;
}
if(LOBYTE(wsaData.wVersion)!
=2||HIBYTE(wsaData.wVersion)!
=2)
{
printf("Winsock版本号不匹配\n");
WSACleanup();//卸载调用函数所加载的库
return;
}
sockS=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
addrS.sin_addr.s_addr=inet_addr("127.0.0.1");
addrS.sin_family=AF_INET;
addrS.sin_port=htons(5000);
if(bind(sockS,(LPSOCKADDR)&addrS,sizeof(addrS))==SOCKET_ERROR)
{
printf("指定本地地址发生错误%d",WSAGetLastError());
closesocket(sockS);
return;
}
if(listen(sockS,1)==SOCKET_ERROR)//使服务器进入监听状态
{
printf("进入监听状态发生错误%s",WSAGetLastError());//如果发生错误则打印错误状态
closesocket(sockS);
return;
}
printf("等待客户端的连接......\n");
while
(1)//等待客户端的连接
{
sockU=SOCKET_ERROR;
while(sockU==SOCKET_ERROR)
{
sockU=accept(sockS,NULL,NULL);
}
sockS=sockU;
break;
}
while
(1)
{
for(i=0;i<100;i++)
recvBuf[i]=NULL;
do
{
bytesRecv=recv(sockS,recvBuf,100,0);
if(bytesRecv==0||bytesRecv==WSAENETRESET)
{
continue;
}
if(bytesRecv<0)return;
}
while(bytesRecv==SOCKET_ERROR);
printf("客户端:
\n");
printf("%s\n",recvBuf);
printf("服务器:
\n");
gets(sendBuf);
bytesSent=send(sockS,sendBuf,strlen(sendBuf),0);//发送数据
}
return;
}
6.2客户端:
#include
#include
#pragmacomment(lib,"ws2_32.lib")
voidmain()
{
SOCKETsockU;
intport=5000;
intbytesSent;
inti;
intbytesRecv;
charsendbuf[100];
charrecvbuf[100];
structsockaddr_insockU_tcpaddr;
WORDwVersionRequested;
WSADATAwsaData;
wVersionRequested=MAKEWORD(2,2);
if(WSAStartup(wVersionRequested,&wsaData)!
=0)
{
printf("%s","套接口错误");
return;
}
if(wsaData.wVersion!
=wVersionRequested)//wsaData.wVersion用于储存返回的版本号
{
//Winsock版本号不匹配
WSACleanup();
printf("%s","Winsock版本号不匹配");
return;
}
sockU=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sockU==INVALID_SOCKET)
{
printf("错误的代码是:
%d",WSAGetLastError());
WSACleanup();
return;
}
sockU_tcpaddr.sin_family=AF_INET;
sockU_tcpaddr.sin_port=htons(port);
sockU_tcpaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
if(connect(sockU,(LPSOCKADDR)&sockU_tcpaddr,sizeof(sockU_tcpaddr))==SOCKET_ERROR)
{
printf("%s","连接服务器发生错误啦!
\n");
printf("%ld\n",WSAGetLastError());
closesocket(sockU);
return;
}
printf("连接成功!
请输入你的聊天信息...\n");
while
(1)
{
printf("客户端:
\n");
gets(sendbuf);
bytesSent=send(sockU,sendbuf,strlen(sendbuf),0);//发送数据
do
{
for(i=0;i<100;i++)
recvbuf[i]=NULL;
bytesRecv=recv(sockU,recvbuf,100,0);
if(bytesRecv==0||bytesRecv==WSAENETRESET)
{
continue;
}
if(bytesRecv<0)return;
printf("服务器:
\n");
printf("%s\n",recvbuf);
break;
}
while(bytesRecv==SOCKET_ERROR);
}
return;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 大小 学期 软件 课程设计 报告