《 网 络 编 程 》
实 验 指 导 书
梁 峰 微机综合实验室
随着计算机和Internet网络的发展,原先在测量、控制、消费等领域不同设备/仪器之间,大多采用RS232/485或现场总线组建网络等进行数据传输的情况正在改变,特别在要求数据传输速度和可靠性方面的应用产品,转向基于Internet网络的远程传输和应用。网络编程大多基于TCP/IP协议,实现方法有多种,复杂但编程适应性广的方法是调用底层的Winsock API函数或MFC基本类等;简单方便的方法可以采用如Winsock控件。在网络编程中最常用的方案便是客户机/服务器模型,客户应用程序向服务器程序请求服务;另外一种模式是点对点通信,通信双方对等,既有客户机功能又有服务器的功能,编程简单,适合传输数据流少的场合,而且采用简单的UDP协议,易于用微控制器等嵌入式系统实现,在测量控制方面有许多应用。 本实验指导书将介绍一些网络编程和Winsock控件知识,用VC++实现网络间的通信。本实验共有16学时,分为8次实验进行。 实验一 网络编程相关知识的介绍及学习
一.实验目的:了解TCP/IP体系结构,Winsock编程套接字原理,Windows Sockets网络程序设计核心原理 二.实验任务:学习网络编程的原理,熟悉VC++6.0,MFC类的生成向导等工具的使用 三.实验内容
1. 了解TCP/IP体系结构
TCP/IP协议的核心部分是传输层协议(TCP、UDP>,网络层协议(IP>和物理接口层,这三层通常是在操作系统内核中实现。因此用户一般不涉及。编程时,编程界面有两种形式:<1)是由内核心直接提供的系统调用;<2)使用以库函数方式提供的各种函数。前者为核内实现,后者为核外实现。用户服务要通过核外的应用程序才能实现,所以要使用套接字(socket>来实现。 下图是TCP/IP协议核心与
应用程序关系图。
2. 套接字Sockets及Winsock编程原理
Windows Sockets接口是TCP/IP网络最为通用API<应用程序接口),已成为Windows网络编程的事实上的标准。它以Unix中流行的Socket接口为范例定义了一套Microsoft Windows下网络编程接口函数库。它不仅包含了人们所熟悉的Berkeley Socket风格的库函数;也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。 SOCKET实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有SOCKET接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个SOCKET接口来实现。在应用开发中就像使用文件句柄一样,可以对SOCKET句柄进行读,写操作。 VC++对原来的WindowsSockets库函数进行了一系列封装,继而产生了CAsynSocket、CSocket、CSocketFile等类,它们封装着有关Socket的各种功能。 在VC中进行WINSOCK的API编程开发,需要使用到下面三个文件: WINSOCK.H:这是WINSOCK API的头文件。
WSOCK32.LIB: WINSOCK API连接库文件。在使用中,一点要把它作为项目的非缺省的连接库包含到项目文件中去。 WINSOCK.DLL:WINSOCK的动态连接库。
总的来说,使用SOCKET接口<面向连接或无连接)进行网络通信时,必须按下面简单的四步进行处理:
(1) 程序必须建立一个 SOCKET。
(2) 程序必须按要求配置此SOCKET。也就是说,程序要么将此SOCKET连
接到远方的主机上,要么给此SOCKET指定一个本地协议端口。 (3) 程序必须按要求通过此SOCKET发送和接收数据。 <4) 程序必须关闭此SOCKET。 3.WINSOCK API主要函数简介
<1)WSAStartup(>:连结应用程序与 Windows Sockets DLL 的第一个函数。 说明: 此函数是应用程序调用 Windows Sockets DLL函数中的第一个,也唯有此函数呼叫成功後,才可以再调用其他 Windows Sockets DLL 的函数。 <2)WSACleanup(>:结束 Windows Sockets DLL 的使用。
说明: 当应用程序不再需要使用 Windows Sockets DLL时,须调用此函数来注销使用,以便释放其占用的资源。 <3)socket(>:建立Socket。
说明: 此函数用来建立一 Socket 描述字,并为此 Socket 建立其所使用的资源。
<4)closesocket(>:关闭某一Socket。
说明: 此一函数是用来关闭某一 Socket。
<5) bind(>:将一本地地址与一个SOCKET描述字连接在一起。
说明:此函数在服务程序上使用,是调用监听函数listen(>必须要调用的函数。
<6)listen(>:设定 Socket 为监听状态,准备被连接。
说明: 此函数在服务程序上使用,来设定 Socket 进入监听状态,并设定最多可有多少个在未真正完成连接前的客户端的连接要求。(目前最大值限制为 5, 最 小值为1>
<7)accept(>:接受某一Socket的连接要求,以完成面向连接的客户端 Socket 的连接请求。 说明: 服务端应用程序调用此函数来接受客户端Socket 连接请求,accept(> 函数的返回值为一新的 Socket,新 Socket 就可用来在服务端和客户端之间的信息传递接收,而原来 Socket 仍然可以接收其他客户端的连接要求。 <8)connect(>:要求连接某一Socket到指定的网络上服务端。
说明: 此函数用在客户端,用来向服务端要求建立连接。当连接建立完成後,客户端即可利用此 Socket 来与服务端进行信息传递。 <9)recv(>:从面向连接的 Socket 接收信息。
说明: 此函数用来从面向连接的 Socket 接收信息。 <10)send(>:使用面向连接的 Socket 发送信息。
说明: 此函数用来从面向连接的 Socket 发送信息。
<11)WSAAsyncSelect(>:要求某一 Socket 有事件 (event> 发生时通知使用者。 说明: 此函数用来请求Windows Sockets DLL 为窗口句柄发一条消息-无论它何时检测到由lEvent参数指明的网络事件。要发送的消息由wMsg参数标明.被通知的套接口由s标识。本函数自动将套接口设置为非阻塞模式。 lEvent参数由下表中列出的值组成。 值 意义
FD_READ 欲接收读准备好的通知。 FD_WRITE 欲接收写准备好的通知。 FD_OOB 欲接收带边数据到达的通知。 FD_ACCEPT 欲接收将要连接的通知。 FD_CONNECT 欲接收已连接好的通知。 FD_CLOSE 欲接收套接口关闭的通知。
实验二 UDP通信程序的编制
网络编程实验指导书



