网络编程实验指导书.docx
- 文档编号:24706951
- 上传时间:2023-05-31
- 格式:DOCX
- 页数:33
- 大小:442.59KB
网络编程实验指导书.docx
《网络编程实验指导书.docx》由会员分享,可在线阅读,更多相关《网络编程实验指导书.docx(33页珍藏版)》请在冰豆网上搜索。
网络编程实验指导书
《网络编程》
实验指导书
梁峰
微机综合实验室
随着计算机和Internet网络的发展,原先在测量、控制、消费等领域不同设备/仪器之间,大多采用RS232/485或现场总线组建网络等进行数据传输的情况正在改变,特别在要求数据传输速度和可靠性方面的应用产品,转向基于Internet网络的远程传输和应用。
网络编程大多基于TCP/IP协议,实现方法有多种,复杂但编程适应性广的方法是调用底层的Winsock API函数或MFC基本类等;简单方便的方法可以采用如Winsock控件。
在网络编程中最常用的方案便是客户机/服务器模型,客户应用程序向服务器程序请求服务;另外一种模式是点对点通信,通信双方对等,既有客户机功能又有服务器的功能,编程简单,适合传输数据流少的场合,而且采用简单的UDP协议,易于用微控制器等嵌入式系统实现,在测量控制方面有许多应用。
本实验指导书将介绍一些网络编程和Winsock控件知识,用VC++实现网络间的通信。
本实验共有16学时,分为8次实验进行。
实验一网络编程相关知识的介绍及学习
一.实验目的:
了解TCP/IP体系结构,Winsock编程套接字原理,WindowsSockets网络程序设计核心原理
二.实验任务:
学习网络编程的原理,熟悉VC++6.0,MFC类的生成向导等工具的使用
三.实验内容
1.了解TCP/IP体系结构
TCP/IP协议的核心部分是传输层协议(TCP、UDP),网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中实现。
因此用户一般不涉及。
编程时,编程界面有两种形式:
(1)是由内核心直接提供的系统调用;
(2)使用以库函数方式提供的各种函数。
前者为核内实现,后者为核外实现。
用户服务要通过核外的应用程序才能实现,所以要使用套接字(socket)来实现。
下图是TCP/IP协议核心与应用程序关系图。
2.套接字Sockets及Winsock编程原理
WindowsSockets接口是TCP/IP网络最为通用API(应用程序接口),已成为Windows网络编程的事实上的标准。
它以Unix中流行的Socket接口为范例定义了一套MicrosoftWindows下网络编程接口函数库。
它不仅包含了人们所熟悉的BerkeleySocket风格的库函数;也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。
SOCKET实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有SOCKET接口的计算机通信。
应用程序在网络上传输,接收的信息都通过这个SOCKET接口来实现。
在应用开发中就像使用文件句柄一样,可以对SOCKET句柄进行读,写操作。
VC++对原来的WindowsSockets库函数进行了一系列封装,继而产生了CAsynSocket、CSocket、CSocketFile等类,它们封装着有关Socket的各种功能。
在VC中进行WINSOCK的API编程开发,需要使用到下面三个文件:
WINSOCK.H:
这是WINSOCKAPI的头文件。
WSOCK32.LIB:
WINSOCKAPI连接库文件。
在使用中,一点要把它作为项目的非缺省的连接库包含到项目文件中去。
WINSOCK.DLL:
WINSOCK的动态连接库。
总的来说,使用SOCKET接口(面向连接或无连接)进行网络通信时,必须按下面简单的四步进行处理:
(1)程序必须建立一个SOCKET。
(2)程序必须按要求配置此SOCKET。
也就是说,程序要么将此SOCKET连接到远方的主机上,要么给此SOCKET指定一个本地协议端口。
(3)程序必须按要求通过此SOCKET发送和接收数据。
(4)程序必须关闭此SOCKET。
3.WINSOCKAPI主要函数简介
(1)WSAStartup():
连结应用程序与WindowsSocketsDLL的第一个函数。
说明:
此函数是应用程序调用WindowsSocketsDLL函数中的第一个,也唯有此函数呼叫成功後,才可以再调用其他WindowsSocketsDLL的函数。
(2)WSACleanup():
结束WindowsSocketsDLL的使用。
说明:
当应用程序不再需要使用WindowsSocketsDLL时,须调用此函数来注销使用,以便释放其占用的资源。
(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)发生时通知使用者。
说明:
此函数用来请求WindowsSocketsDLL为窗口句柄发一条消息-无论它何时检测到由lEvent参数指明的网络事件。
要发送的消息由wMsg参数标明.被通知的套接口由s标识。
本函数自动将套接口设置为非阻塞模式。
lEvent参数由下表中列出的值组成。
值意义
FD_READ欲接收读准备好的通知。
FD_WRITE欲接收写准备好的通知。
FD_OOB欲接收带边数据到达的通知。
FD_ACCEPT欲接收将要连接的通知。
FD_CONNECT欲接收已连接好的通知。
FD_CLOSE欲接收套接口关闭的通知。
实验二UDP通信程序的编制
一.实验目的:
了解UDP协议基础,学习使用WinSock进行无连接的通信的方法
二.实验任务:
编程实现基于UDP的通信程序
三.实验内容
1.UDP协议基础
UDP协议是英文UserDatagramProtocol的缩写,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络应用。
包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。
与我们所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。
根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。
UDP协议的主要作用是将网络数据流量压缩成数据报的形式。
一个典型的数据报就是一个二进制数据的传输单位。
每一个数据报的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。
UDP协议使用端口号为不同的应用保留其各自的数据传输通道。
UDP和TCP协议正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。
数据发送一方(可以是客户端或服务器端)将UDP数据报通过源端口发送出去,而数据接收一方则通过目标端口接收数据。
有的网络应用只能使用预先为其预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。
因为UDP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。
一般来说,大于49151的端口号都代表动态端口。
数据报的长度是指包括报头和数据部分在内的总的字节数。
因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)。
数据报的最大长度根据操作环境的不同而各异。
从理论上说,包含报头在内的数据报的最大长度为65535字节。
不过,一些实际应用往往会限制数据报的大小,有时会降低到8192字节。
UDP协议使用报头中的校验值来保证数据的安全。
校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。
如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。
这与TCP协议是不同的,后者要求必须具有校验值。
2.UDP编程基础
由于UDP协议并不需要建立一个明确的连接,因此建立UDP应用要比建立TCP应用简单得多。
WinSock提供了对UDP(用户数据报协议)的支持,通过UDP协议可以向指定IP地址的主机发送数据,同时也可以从指定IP地址的主机接收数据,发送和接收方处于相同的地位没有主次之分。
利用CSocket操纵无连接的数据发送,首先生成一个本地套接口(需要指明SOCK_DGRAM标记),然后利用
intCAsyncSocket:
:
SendTo(constvoid*lpBuf,intnBufLen,UINTnHostPort,LPCTSTRlpszHostAddress=NULL,intnFlags=0)发送数据,
intCAsyncSocket:
:
ReceiveFrom(void*lpBuf,intnBufLen,CString&rSocketAddress,UINT&rSocketPort,intnFlags=0)接收数据。
函数调用顺序如图。
利用UDP协议发送和接收都可以是双向的,就是说任何一个主机都可以发送和接收数据。
但是UDP协议是无连接的,所以发送的数据不一定能被接收,此外接收的顺序也有可能与发送顺序不一致。
下面是相关代码:
/*
发送方在端口6800上向接收方端口6801发送数据
*/
//发送方代码:
BOOLCMy62_s1_clientDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();m_sockSend.Create(6800,SOCK_DGRAM,NULL);//创建本地套接口
m_sockSend.Bind(6800,"127.0.0.1");//绑定本地套接口
SetTimer(1,3000,NULL);//创建一个定时器定时发送
...
}
voidCMy62_s1_clientDlg:
:
OnTimer(UINTnIDEvent)
{
staticiIndex=0;
charszSend[20];
sprintf(szSend,"%010d",iIndex++);
intiSend=m_sockSend.SendTo(szSend,10,6801,"127.0.0.1",0);//发送UDP数据
TRACE("sent%dbyte\n",iSend);
...
}
//接收方代码
BOOLCMy62_s1_serverDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();m_sockRecv.Create(6801,SOCK_DGRAM,"127.0.0.1");//创建本地套接口
m_sockRecv.Bind(6801,"127.0.0.1");//绑定本地套接口
SetTimer(1,3000,NULL);//创建一个定时器定时读取
...
}
voidCMy62_s1_serverDlg:
:
OnTimer(UINTnIDEvent)
{
charszRecv[20];
CStringszIP("127.0.0.1");
UINTuPort=6800;
intiRecv=m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort,0);//接收UDP数据
TRACE("received%dbyte\n",iRecv);
...
}
/*
接收方采用同步读取数据的方式,所以没有读到数据函数调用将不会返回
*/
3.使用UDP协议实现发送、接收数据的程序
(1)建立UDP客户端程序,由小到大显示数字,如下图所示
(2)建立UDP服务器端程序,如下图所示
(3)客户端程序通过UDP协议向服务器程序发送数据,服务器程序接收数据并显示,如图所示:
实验三TCP通信程序的编制
一.实验目的:
了解TCP协议基础,学习使用WinSock进行有连接的通信的方法
二.实验任务:
编程实现基于TCP的通信程序
三.实验内容
1.TCP协议基础
TCP(TransferControlProtocol)是传输控制协议的简称,是基于连接的协议,在数据传输之前必须先建立连接,通信双方是基于客户/服务器模型,必须分别建立客户应用程序和服务器应用程序。
TCP协议主要为了在主机间实现高可靠性的包交换传输协议。
TCP是面向连接的端到端的可靠协议。
它支持多种网络应用程序。
TCP对下层服务没有多少要求,它假定下层只能提供不可靠的数据报服务,它可以在多种硬件构成的网络上运行。
下面的图是TCP在层次式结构中的位置,它的下层是IP协议,TCP可以根据IP协议提供的服务传送大小不定的数据,IP协议负责对数据进行分段,重组,在多种网络中传送。
TCP的上面就是应用程序,下面是IP协议,上层接口包括一系列类似于操作系统中断的调用。
对于上层应用程序来说,TCP应该能够异步传送数据。
下层接口假定为IP协议接口。
为了在并不可靠的网络上实现面向连接的可靠的传送数据,TCP必须解决可靠性,流量控制的问题,必须能够为上层应用程序提供多个接口,同时为多个应用程序提供数据,同时TCP必须解决连接问题,这样TCP才能称得上是面向连接的,最后,TCP也必须能够解决通信安全性的问题。
进程为了传送数据会调用TCP,将数据和相应的参数传送给TCP,于是TCP会将数据传送到目的TCP那里,当然这是通过将TCP包打包在IP包内在网络上传送达到的。
接收方TCP在接收到数据后会通信上层应用程序,TCP会保证接收数据顺序的正确性。
在实现TCP的主机上,TCP可以被看成是一个模块,和文件系统区别不大,TCP也可以调用一些操作系统的功能,TCP不直接和网络打交道,控制网络的任务由专门的设备驱动模块完成。
TCP只是调用IP接口,IP向TCP提供所有TCP需要的服务。
通过下图可以更清楚地看到TCP协议的结构。
2.TCP编程基础
WinSock提供了对TCP(传输控制协议)的支持,通过TCP协议可以与指定IP地址的主机建立,同时利用建立的连接可以双向的交换数据。
利用CSocket操纵有连接数据交换很简单,但是在有连接的通信中必需有一方扮演服务器的角色等待另一方(客户方)的连接请求,所以服务器方需要建立一个监听套接口,然后在此套接口上等待连接。
当连接建立后会产生一个新的套接口用于通信。
而客户方在创建套接口后只需要简单的调用连接函数就可以创建连接。
对于有连接的通信不论是数据的发送还是发送与接收的顺序都是有保证的。
双方的函数调用顺序如图。
下面的代码演示了如何建立连接和发送/接收数据:
/*
服务器方在端口6802上等待连接,当连接建立后关闭监听套接口
客户方向服务器端口6802发起连接请求
*/
BOOLCMy63_s1_serverDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
CSocketsockListen;sockListen.Create(6802,SOCK_STREAM,"127.0.0.1");//创建本地套接口
sockListen.Bind(6802,"127.0.0.1");//绑定参数
sockListen.Listen(5);
sockListen.Accept(m_sockSend);//等待连接请求,m_sockSend为成员变量,用于通信
sockListen.Close();//关闭监听套接口
SetTimer(1,3000,NULL);//启动定时器,定时发送数据
...
}
voidCMy63_s1_serverDlg:
:
OnTimer(UINTnIDEvent)
{
staticiIndex=0;
charszSend[20];
sprintf(szSend,"%010d",iIndex++);
intiSend=m_sockSend.Send(szSend,10,0);//发送TCP数据
...
}
BOOLCMy63_s1_clientDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
m_sockRecv.Create();//创建本地套接口
BOOLfC=m_sockRecv.Connect("127.0.0.1",6802);//发起连接请求
TRACE("connectis%s\n",(fC)?
"OK":
"Error");SetTimer(1,3000,NULL);//启动定时器,定时接收数据
...
}
voidCMy63_s1_clientDlg:
:
OnTimer(UINTnIDEvent)
{
charszRecv[20];
intiRecv=m_sockRecv.Receive(szRecv,10,0);//接收TCP数据
TRACE("received%dbyte\n",iRecv);
if(iRecv>=0)
{
szRecv[iRecv]='\0';
m_szRecv=szRecv;
UpdateData(FALSE);
}
3.使用TCP协议实现发送、接收数据的程序
(1)建立TCP服务器程序,监听端口的信息
(2)建立TCP客户端程序,连接服务器程序
(3)客户端程序通过TCP协议连接服务器程序,并接收和显示服务器程序发出的数据,如图所示:
实验四FTP程序的实现
一.实验目的:
了解FTP协议基础,学习利用WinSock实现FTP的方法
二.实验任务:
编程实现FTP程序
三.实验内容
1.FTP协议基础
FTP是TCP/IP协议组中的协议之一,是英文FileTransferProtocol的缩写。
该协议是Internet文件传送的基础,它由一系列规格说明文档组成,目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据。
简单的说,FTP就是完成两台计算机之间的拷贝,从远程计算机拷贝文件至自己的计算机上,称之为“下载(download)”文件。
若将文件从自己计算机中拷贝至远程计算机上,则称之为“上载(upload)”文件。
在TCP/IP协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20。
依照FTP协议提供服务,进行文件传送的计算机就是FTP服务器,而连接FTP服务器,遵循FTP协议与服务器传送文件的电脑就是FTP客户端。
FTP协议的任务是从一台计算机将文件传送到另一台计算机,它与这两台计算机所处的位置、联接的方式、甚至是是否使用相同的操作系统无关。
假设两台计算机能通过ftp协议对话,并且能访问Internet,就可以用ftp命令来传输文件。
每种操作系统使用上有某一些细微差别,但是每种协议基本的命令结构是相同的。
FTP的传输有两种方式:
ASCII传输模式和二进制数据传输模式。
(1)ASCII传输方式:
假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。
但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件(尽管字处理文件包含的大部分是文本,其中也包含有指示页尺寸,字库等信息的非打印字符)。
在拷贝任何非文本文件之前,用binary命令告诉ftp逐字拷贝,不要对这些文件进行处理,这也是下面要讲的二进制传输。
(2)二进制传输模式:
在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。
即使目的地机器上包含位序列的文件是没意义的。
例如,macintosh以二进制方式传送可执行文件到Windows系统,在对方系统上,此文件不能执行。
如果你在ASCII方式下传输二进制文件,即使不需要也仍会转译。
这会使传输稍微变慢,也会损坏数据,使文件变得不能用。
(在大多数计算机上,ASCII方式一般假设每一字符的第一有效位无意义,因为ASCII字符组合不使用它。
如果你传输二进制文件,所有的位都是重要的。
)如果你知道这两台机器是同样的,则二进制方式对文本文件和数据文件都是有效的。
FTP支持工作两种模式,一种方式叫做Standard(也就是PORT方式,主动方式),一种是Passive(也就是PASV,被动方式)。
Standard模式FTP的客户端发送PORT命令到FTP服务器。
Passive模式FTP的客户端发送PASV命令到FTPServer。
下面介绍一个这两种方式的工作原理:
Port模式FTP客户端首先和FTP服务器的TCP21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。
PORT命令包含了客户端用什么端口接收数据。
在传送数据的时候,服务器端通过自己的TCP20端口连接至客户端的指定端口发送数据。
FTPserver必须和客户端建立一个新的连接用来传送数据。
Passive模式在建立控制通道的时候和Standard模式类似,但建立连接后发送的不是Port命令,而是Pasv命令。
FTP服务器收到Pasv命令后,随机打开一个高端端口(端口号大于1024)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口,然后FTP服务器将通过这个端口进行数据的传送,这个时候FTPserver不再需要建立一个新的和客户端之间的连接。
2.FTP编程基础
FTP协议使用两条单独的TCP连接,一条专用于发送FTP命令,另一条则专用于传递数据。
初始建立连接时,服务器在21号端口上接收来自客户端的命令连接。
当需要传送数据时(文件列表、文件数据等),客户端向服务器发出Port命令,并进入监听状态,等待来自服务器的数据连接请求。
要联接到FTP服务器,需要两个步骤,必须创建一个CIntern
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 编程 实验 指导书