北科大小学期软件课程设计报告.docx

上传人:b****1 文档编号:13387247 上传时间:2023-06-13 格式:DOCX 页数:17 大小:586.34KB
下载 相关 举报
北科大小学期软件课程设计报告.docx_第1页
第1页 / 共17页
北科大小学期软件课程设计报告.docx_第2页
第2页 / 共17页
北科大小学期软件课程设计报告.docx_第3页
第3页 / 共17页
北科大小学期软件课程设计报告.docx_第4页
第4页 / 共17页
北科大小学期软件课程设计报告.docx_第5页
第5页 / 共17页
北科大小学期软件课程设计报告.docx_第6页
第6页 / 共17页
北科大小学期软件课程设计报告.docx_第7页
第7页 / 共17页
北科大小学期软件课程设计报告.docx_第8页
第8页 / 共17页
北科大小学期软件课程设计报告.docx_第9页
第9页 / 共17页
北科大小学期软件课程设计报告.docx_第10页
第10页 / 共17页
北科大小学期软件课程设计报告.docx_第11页
第11页 / 共17页
北科大小学期软件课程设计报告.docx_第12页
第12页 / 共17页
北科大小学期软件课程设计报告.docx_第13页
第13页 / 共17页
北科大小学期软件课程设计报告.docx_第14页
第14页 / 共17页
北科大小学期软件课程设计报告.docx_第15页
第15页 / 共17页
北科大小学期软件课程设计报告.docx_第16页
第16页 / 共17页
北科大小学期软件课程设计报告.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

北科大小学期软件课程设计报告.docx

《北科大小学期软件课程设计报告.docx》由会员分享,可在线阅读,更多相关《北科大小学期软件课程设计报告.docx(17页珍藏版)》请在冰点文库上搜索。

北科大小学期软件课程设计报告.docx

北科大小学期软件课程设计报告

北京科技大学

软件课程设计报告

——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的作用就是用来提供这些信息的,stdio.h是C编译系统提供的一个文件名,stdio是“standardinput&output”的缩写,即有关标准输入输出的信息。

在程序中用到系统提供的标准函数库中的输入输出函数时,应在程序的开头写上一行:

#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;

}

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

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

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2