资源描述
郑州轻工业学院
课 程 设 计 任 务 书
题 目:
Winsocket网络编程
姓 名:
齐津涛
院(系):
数学与信息科学系
专业班级:
信科09-1班
学 号:
540910010124
指导教师:
裴云霞,时海亮
时 间:
2012年6月17日至2012年6月22日
25
一、课程目标
深入理解计算机网络基本原理,将书本上抽象的概念与具体的实现技术相结合,体会网络协议的设计与实现过程,以及专业技术人员所使用的基本方法和技巧;熟悉相关应用开发工具,掌握网络协议应用开发技术;进一步熟悉网络设备,学习组网技术,掌握网络规划与设计的基本方法;培养一定的自学能力和独立分析问题、解决问题的能力;对设计中遇到的问题,能通过独立思考、查阅资料、参考文献,寻求解决方案。
二、设计题目说明
设计题目设置上,采取了分类、分级的形式。
分3个类别,分别是组网设计、WINSOCKET编程、网络服务编程。
分3个级别,从高至低分别是A、B、C。题目的级别综合依据创新性、综合性、实用性、难度等因素,不同级别,成绩起评分数有别。
A级题目(良-优):较难;综合性强、有明显或突出的创新、探究性较强、实际课题或项目的一部分(实用性);工作量非常饱满;富有建设性;有很强的分析问题与解决问题的能力。
B级题目(中-良):难度适中;工作内容侧重于设计或研究或较高水平应用;有一定综合性、有一定创新、有一定实用性;工作量饱满;有较强的分析问题与解决问题的能力。
C级题目(及格-中):难度不大或偏小;工作内容侧重于验证或学习或简单应用;基本上无创新;工作量不大;有一定的分析问题与解决问题的能力。
三、任务完成形式
(1)交付课程设计说明书(纸质)
四、基本要求及主要内容
第一类题目 基于WEB的动态网页制作
设计要求
通过以下过程:需求分析、E-R模型、关系模型分析,在数据库中构建数据库、表或视图,熟悉数据库开发流程;在时间允许的情况下,适当考虑页面的美观。
1.网上报名、查分系统的设计与实现[C]
2.基于Web的新闻发布系统[C]
第二类题目 组网设计
(以方案设计为主,以网络仿真为辅,仿真部分需要用Packet Tracer)
要求:
(1)论文论述详尽,主要内容有:
设计任务、需求分析、总体设计方案与拓扑图、设备选型、关键设计、仿真配置与测试、结论。
(3)对方案中关键设计,尽可能用仿真软件进行仿真配置与测试。
组网仿真软件建议采用packet tracer(只能仿真cisco的部分中低端网络设备),
当然为了能在该软件中进行仿真,对原方案中的设计进行必要的简化、设备作必要的变通是必然的。
(4)题目中的“某”,必须为具体的单位名称(最好为自己所熟悉的)
(5)没有特别说明时,目标网络规模为中等规模的园区网络(信息节点数为500个到5000个之间)
(6)没有特别说明时,VLAN技术、RIP或OSPF动态路由技术必须运用到设计中
(7)没有特别说明时,支持internet接入
1. 某校园网组网路由方案设计(基于Packet Tracer) [A]
某大学网络有20000余信息节点,分办公、教学、学生宿舍、家属四个区,
请结合实际分析其需求,重新对其网络进行规划设计:
(1)技术选型、总体设计
(2)设备选型
(3)详细的拓扑设计
(4)详细的IP规划(从网段到节点)
(5)给出合理的路由方案、含internet出口与教育网出口路由
(6)实现仿真配置与测试
(7)支持远程用户访问
2. 某校园网内网VLAN方案设计(基于Packet Tracer) [B]
某大学网络有10000余信息节点,分办公、教学、学生宿舍、家属四个区,
请结合实际分析其需求,重新对其网络进行规划设计,不考虑与外网的互联:
(1)技术选型、总体设计
(2)设备选型
(3)详细的拓扑设计
(4)IP规划、VLAN设计、
(5)VLAN路由设计
(6)实现仿真配置与测试
3. 某单位(企业、医院、社区、学生公寓、学校、酒店)网络规划与设计(基于Packet Tracer)[B]
对某单位的网络进行需求分析,完成下列设计任务:
(1)给出技术选型、总体设计
(2)给出设备选型
(3)给出详细的拓扑设计
(4)给出VLAN设计、ip规划
(5)给出路由设计
(6)实现仿真配置与测试
第三类题目 winsocket网络编程
掌握TCP和UDP套接字编程的原理
1.局域网实时通讯工具[A]
2.网络文件传输[A]
五、主要参考文献
[1] Andrew S.Tanenbaum、David J.Wetherall. 计算机网络(英文版•第5版). 机械工业出版社
[2]谢希仁. 计算机网络(第5版). 电子工业出版社
[3]吴功宜. 计算机网络课程设计. 机械工业出版社 //C语言编程
[4] 王勇. 计算机网络课程设计(计算机课程设计与综合实践规划教材). 清华大学出版社 //Java编程
[5] 叶树华. 网络编程实用教程(第2版). 人民邮电出版社.2010 //适合初学者
[6] 王艳平. Windows网络与通信程序设计(第二版). 人民邮电出版社 //适合高手
[7] 金华. C#网络编程技术教程(21世纪高等院校网络工程规划教材). 人民邮电出版社
[8] 思科网络技术学院CCNA Exploration4.0——LAN交换和无线
[9] 思科网络技术学院CCNA Exploration4.0——路由协议和概念
完成期限:
2012年6月23日
指导教师签名:
裴云霞
课程负责人签名:
裴云霞
2012年6月17日
摘 要
本程序实现一个基于TCP/IP协议的较为简单的客户端/服务器通信的聊天室程序,在VISUAL C++平台上,使用MFC框架,编写了此程序。WINDOWS下编写网络应用程序利用SOCKET套接字进行数据通信,套接字可以理解为网络数据通信的一个代理。本程序即通过调用套接字函数,实现客户端与服务器的简单通信。
关键字 聊天软件 WINSOCK 网络通信 MFC 套接字函数
目录
课 程 设 计 任 务 书 1
四、基本要求及主要内容 2
第一类题目 基于WEB的动态网页制作 2
第二类题目 组网设计 3
1. 某校园网组网路由方案设计(基于Packet Tracer) [A] 3
某大学网络有20000余信息节点,分办公、教学、学生宿舍、家属四个区, 3
请结合实际分析其需求,重新对其网络进行规划设计: 3
(1)技术选型、总体设计 3
(2)设备选型 3
(3)详细的拓扑设计 3
(4)详细的IP规划(从网段到节点) 3
(5)给出合理的路由方案、含internet出口与教育网出口路由 3
(6)实现仿真配置与测试 3
(7)支持远程用户访问 3
2. 某校园网内网VLAN方案设计(基于Packet Tracer) [B] 3
某大学网络有10000余信息节点,分办公、教学、学生宿舍、家属四个区, 4
请结合实际分析其需求,重新对其网络进行规划设计,不考虑与外网的互联: 4
(1)技术选型、总体设计 4
(2)设备选型 4
(3)详细的拓扑设计 4
(4)IP规划、VLAN设计、 4
(5)VLAN路由设计 4
(6)实现仿真配置与测试 4
3. 某单位(企业、医院、社区、学生公寓、学校、酒店)网络规划与设计(基于Packet Tracer)[B] 4
对某单位的网络进行需求分析,完成下列设计任务: 4
(1)给出技术选型、总体设计 4
(2)给出设备选型 4
(3)给出详细的拓扑设计 4
(4)给出VLAN设计、ip规划 4
(5)给出路由设计 4
(6)实现仿真配置与测试 4
第三类题目 winsocket网络编程 4
五、主要参考文献 4
摘 要 6
1.winsocket网络编程 7
1.1概述 7
1.2 TCP/IP特点 9
1.3 WinSock模型 10
1.4 套接字原理 10
2. Socket编程的基本过程 11
2.1设计流程 11
2.2基本套接字 15
3.程序的设计 20
1、Socket服务器端: 20
4服务器功能的实现 35
5实验小结 36
1.winsocket网络编程
1.1概述
80's初,ARPA(美国国防部高级研究计划局),加利福尼亚大学Berkeley分校提供资金,开发在UNIX下实现TCP/IP协议。为TCP/IP开发了一个API –– Socket接口(套接口)–– 俗称Bekeley套接口模型。90's初,Microsoft等公司基于Bekeley套接口模型制定了Windows Sockets规范(简称WinSock)已是TCP/IP网络的标准。
1993.1,v1.1
1995.5,v2.0,增加了QOS (网络服务质量控制)
1.2 TCP/IP特点
TCP/IP协议的核心部分是传输层协议(TCP、UDP)、网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中实现,因此用户一般不涉及。编程时,编程界面有两种形式:第一种是由内核心直接提供的系统调用;第二种是使用以库函数方式提供的各种函数。前者为核内实现,后者为核外实现。用户服务要通过核外的应用程序才能实现,所以要使用套接字(socket)来实现。TCP/IP协议核心与应用程序关系如图所示。
1.3 WinSock模型
①TCP(传输控制协议)
提供虚电路和面向连接的数据流传输服务。
实现无差错无重复的顺序数据传输。
②UDP(用户数据报协议)
提供无连接的数据报传输服务。
数据通过相互独立的报文进行传输,是无序的,并且不保证可靠、无差错。
1.4 套接字原理
客户机与服务器建立面向连接的(基于TCP)套接字进行通信,请求与响应过程及应用程序流程可用图7-3、图7- 4来表示。
服务器端程序工作过程:
(1)创建套接字(socket);
(2)将套接字绑定到一个本地地址和端口上(bind);
(3)将套接字设为监听模式,准备接收客户端请求(listen);
(4)等待客户端请求,当请求到达后,接受连接请求,返回一个新的对应于此次连接的套接字(accept);
(5)用返回的套接字和客户端进行通信(send/recv);
(6)返回,等待另一客户请求;
(7)关闭套接字;
客户端程序工作过程:
(1)创建套接字(socket);
(2)向服务器端发出连接请求(connect);
(3)和服务器端进行通信(send/recv);
(4)关闭套接字;
2. Socket编程的基本过程
2.1设计流程
对于任何基于WinSock的编程首先必须要初始化WinSock DLL库,使用接口函数:
int WSAStarup( WORD wVersionRequested,LPWSADATA lpWsAData )
初始化WinSock 。参数wVersionRequested是要求使用的WinSock的版本。
Socket通信分为面向连接的通信(TCP)和面向无连接的通信(UDP),通信流程如下:
面向连接的套接字的系统调用时序图面向连接的套接字的系统调用时序图
无连接协议的套接字调用时序图
面向连接的应用程序流程图
2.2基本套接字
2.2.1 创建套接字——socket()
功能:使用前创建一个新的套接字
格式:SOCKET PASCAL FAR socket(int af,int type,int procotol);
参数:af: 通信发生的区域
type: 要建立的套接字类型
procotol: 使用的特定协议
2.2.2 指定本地地址——bind()
功能:将套接字地址与所创建的套接字号联系起来。
格式:int PASCAL FAR bind(SOCKET s,const struct sockaddr FAR * name,int namelen);
参数:s: 是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。
其它:没有错误,bind()返回0,否则SOCKET_ERROR
地址结构说明:
struct sockaddr_in
{
short sin_family;//AF_INET
u_short sin_port;//16位端口号,网络字节顺序
struct in_addr sin_addr;//32位IP地址,网络字节顺序
char sin_zero[8];//保留
}
2.2.3 建立套接字连接——connect()和accept()
功能:共同完成连接工作
格式:int PASCAL FAR connect(SOCKET s,const struct sockaddr FAR * name,int namelen);
SOCKET PASCAL FAR accept(SOCKET s,struct sockaddr FAR * name,int FAR * addrlen);
参数:同上
2.2.4 监听连接——listen()
功能:用于面向连接服务器,表明它愿意接收连接。
格式:int PASCAL FAR listen(SOCKET s, int backlog);
2.2.5 数据传输——send()与recv()
功能:数据的发送与接收
格式:int PASCAL FAR send(SOCKET s,const char FAR * buf,int len,int flags);
int PASCAL FAR recv(SOCKET s,const char FAR * buf,int len,int flags);
参数:buf:指向存有传输数据的缓冲区的指针。
2.2.6 多路复用——select()
功能:用来检测一个或多个套接字状态。
格式:int PASCAL FAR select(int nfds, Error! Reference source not found.Error! Reference source not found.fd_set FAR * readfds,fd_set FAR * writefds,
fd_set FAR * exceptfds,const struct timeval FAR * timeout);
参数:readfds:指向要做读检测的指针
writefds:指向要做写检测的指针
exceptfds:指向要检测是否出错的指针
timeout:最大等待时间
select()* 执行同步I/O多路复用。
select函数的参数( int nfds, fd_set readfds, fd_set writefds, fd_set exceptfds, const struct timeval timeout )
我记得是:第一个是个较为次要的值,设成0就行了。 后面的几个FD_SET类型的参数才是最重要的;
第一个FD_SET型的参数readfds是表示要被检查是否可读的 Sockets,把你想要接收数据的那个套接字放在这里;
第二个FD_SET参数ritefds是表示要被检查是否可写的 Sockets,将你要发送数据的套接字放在这里;
还有个FD_SET参数exceptfds是表示要被检查是否有错误的 Sockets select()
函数的第五个参数timeout,是让我们用来设定 select 函数要等待(block)多久。
兹述说如下:
(1)如果 timeout 设为「NULL」,那么 select() 就会一直等到「至少」某 一个 socket 的事件成立了才会 return,这和其他的 blocking 函数一样。 select( ..., NULL )
(2)如果 timeout 的值设为 {0, 0} (秒, 微秒),那么 select() 在检查后, 不管有没有 socket 的事件成立,都会马上 return,而不会停留。 timeout.tv_sec = timeout.tv_usec = 0; select( ..., &timeout )
(3)如果 timout 设为 {m, n},那么就会等到至少某一个 socket 的事件发 生,或是时间到了(m 秒 n 微秒),才会 return。 timeout.tv_sec = m; timeout.tv_usec = n; select( ..., &timeout )
返回值:成功 - 符合条件的 Sockets 总数 (若 Timeout 发生,则为 0) 失败 - SOCKET_ERROR (呼叫 WSAGetLastError() 可得知原因)
说明: 使用者可利用此函式来检查 Sockets 是否有资料可被读取,或是有空间可以写入,或是有错误发生。
关于对FD_SET类型的操作,有几个比较重要的宏: FD_ZERO(*set) -- 将 set 的值清乾净 FD_SET(s, *set) -- 将 s 加到 set 中 FD_CLR(s, *set) -- 将 s 从 set 中删除 FD_ISSET(s, *set) -- 检查 s 是否存在於 set 中 参数 readfds、writefds、及 exceptfds 都是 「called by value- result」;而「called by value-result」的意思就是说,我们在将参数传给系统时,要先设启始值,并将这些参数的位址(address)告诉系统;而系统则会利用到这些值来做些运算或其他用途,最后并将结果再写回这些参数的位址中。 因此这些参数的值在传入前和函数返回后,可能会不同;所以每次调用 select() 前,对这些参数一定要重新设定它们的值。 假设我们要检查 socket 1 和 2 目前是否可以用来传送资料,以及 socket 3 是 否有资料可读;我们不打算检查 sockets 是否有错误发生,所以 exceptfds 设为 NULL。步骤大致如下: FD_ZERO( &writefds ); FD_ZERO( &readfds ); FD_SET( 1, &writefds ); FD_SET( 2, &writefds ); FD_SET( 3, &readfds ); select( ..., &readfds, &writefds, NULL, ...) if (FD_ISSET( 1, &writefds )) send( 1, data ); if (FD_ISSET( 2, &writefds )) send( 2, data ); if (FD_ISSET( 3, &readfds )) recv( 3, data );
7、关闭套接字——closesocket()
功能:关闭套接字s
格式:BOOL PASCAL FAR closesocket(SOCKET s);
3.程序的设计
1、Socket服务器端:
Socket服务器端流程如下:加载套接字->创建监听的套接字->绑定套接字->监听套接字->处理客户端相关请求。
下面是孙鑫VC详解里面的服务器端的例子:
C++代码
#include <Winsock2.h>
#include <stdio.h>
void main()
{
//加载套接字
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if (err!=0)
{
return;
}
if (LOBYTE(wsaData.wVersion)!=1||
HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup();
return;
}
//创建监听的套接字
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//把U_LONG的主机字节顺序转换为TCP/IP网络字节顺序
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
//绑定套接字
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//将套接字设置为监听模式,准备接受用户请求
listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
printf("%s\n","welcome,the serve is started...");
while (1)
{
//等待用户请求到来
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char sendBuf[100];
sprintf(sendBuf,"welcome %s to ",inet_ntoa(addrClient.sin_addr));
//发送数据
send(sockConn,sendBuf,100,0);
char revBuf[100];
//接收数据
recv(sockConn,revBuf,100,0);
//打印接受数据
printf("%s\n",revBuf);
//关闭套接字
closesocket(sockConn);
}
}
#include <Winsock2.h>
#include <stdio.h>
void main()
{
//加载套接字
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if (err!=0)
{
return;
}
if (LOBYTE(wsaData.wVersion)!=1||
HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup();
return;
}
//创建监听的套接字
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//把U_LONG的主机字节顺序转换为TCP/IP网络字节顺序
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
//绑定套接字
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//将套接字设置为监听模式,准备接受用户请求
listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
printf("%s\n","welcome,the serve is started...");
while (1)
{
//等待用户请求到来
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char sendBuf[100];
sprintf(sendBuf,"welcome %s to ",inet_ntoa(addrClient.sin_addr));
//发送数据
send(sockConn,sendBuf,100,0);
char revBuf[100];
//接收数据
recv(sockConn,revBuf,100,0);
//打印接受数据
printf("%s\n",revBuf);
//关闭套接字
closesocket(sockConn);
}
}
注意:需要包含头文件<Winsock2.h>,并且在工程设置的link里面加上ws32_2.dll
如果在VC中还有一个简单的加载套接字的方法:
C++代码
if (!AfxSocketInit())
{
AfxMessageBox("套接字加载失败!");
return false;
}
if (!AfxSocketInit())
{
AfxMessageBox("套接字加载失败!");
return false;
}
这个不需要包含上面注里面的头文件和ws2_32.lib库就可以实现加载套接字。
2、Socket客户端:
Socket客户端同样需要先加载套接字,然后创建套接字,不过之后不用绑定和监听了,而是直接连接服务器,发送相关请求。
同样贴出孙鑫VC详解里面的客户端的例子:(不是我偷懒,是人家实在写的太好,无法超越 )
C++代码
#include <Winsock2.h>
#include <stdio.h>
void main()
{
//加载套接字
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if (err!=0)
{
return;
}
if (LOBYTE(wsaData.wVersion)!=1||
HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup();
return;
}
//创建套接字
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//把U_LONG的主机字节顺序转换为TCP/IP网络字节顺序
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
//向服务器发送请求
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//接受数据
char recBuf[100];
recv(sockClient,recBuf,100,0);
printf("%s\n",recBuf);
//发送数据
send(sockClient,"this is 扈修非",strlen("this is 扈修非")+1,0);
//关闭套接字
closesocket(sockClient);
WSACleanup();
}
#include <Winsock2.h>
#include <stdio.h>
void main()
{
//加载套接字
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if (err!=0)
{
return;
}
if (LOBYTE(wsaData.wVersion)!=1||
HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup();
return;
}
//创建套接字
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//把U_LONG的主机字节顺序转换为TCP/IP网络字节顺序
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
//向服务器发送请求
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//接受数据
char recBuf[100];
recv(sockClient,recBuf,100,0);
printf("%s\n",recBuf);
//发送数据
send(sockClient,"this is 扈修非",strlen("this is 扈修非")+1,0);
//关闭套接字
closesocket(sockClient);
WSACleanup();
}
4服务器功能的实现
4.1服务器端功能实现。
4.1.1界面构建
4.1.2客户端功能实现
5实验小结
在编译的过程中,开始出现了许多出错误,函数未定义,连接错误,但是经过努力都一一的解决掉了,经过多次的测试,最终成功的完成了这次实验,实现了局域网间的通信,达到了课程设计的要求,也增长了很多知识.
课程设计成绩评定表
评定项目
内 容
满分
评分
总分
学习态度
学习认真,态度端正,遵守纪律。
10
答疑和设计情况
认真查阅资料,勤学好问,提出的问题有一定的深度,分析解决问题的能力较强。
40
说明书质量
设计方案正确、表达清楚;设计思路、实验(论证)方法科学合理;达到课程设计任务书规定的要求;图、表、文字表达准确规范,上交及时。
40
回答问题情况
回答问题准确,基本概念清楚,有理有据,有一定深度。
10
总成绩
采用五级分制:优、良、中、及格、不及格
指导教师评语:
签名:
年 月 日
展开阅读全文