第三节TCP/IP协议编程实验
|━Windows环境下基于TCP/IP的信息传送程序设计
1.1实验目的:
1、掌握基于TCP/IP协议进行远程通讯的原理
2、掌握Sockets网络程序设计的原理和方法
3、理解面向连接服务、面向无连接的特点
1.2 实验任务
1 学会Winsock 网络编程基础
2 Winsock控件的属性和方法
1.3 实验环境
Windows98 或Windows2000 操作系统,编译环境任选。
1.4 实验方法
一、实验原理
(一)TCP/IP的特点和Socket
TCP/IP是网络上广泛应用的协议,其中IP是网络层的协议,它是无连接的;TCP是传输层的协议,它是面向连接的。在实际系统中,TCP/IP通常在操作系统内核中实现,用户所能感受到的和可以用来进行网络程序开发的是操作系统提供的网络编程界面。在TCP/IP 网络环境下,网络编程界面称为套接字(Socket)(见图1)。
图1、TCP/IP协议核心与应用程序关系图
图1中的应用程序1和2可以是位于不同主机上的2个进程,他们的作用方式是客户/服务器模式。
1、Sockets编程原理
(1)Sockets编程中的主要概念
●协议、地址、端口:
在Sockets编程中,传输层的协议既可以是TCP,也可以是UDP。
Sockets是用于网间进程通讯的,因此在标识上要进行网间进程标识。地址是标识主机的,在Sockets编程中通常指IP地址;而端口标识通信的进程,它可以是1-65535间的任何一个数字,其中1-255保留给特定的服务、256-1023保留给其它的一般服务(如路由函数)、
1024-4999可以被任意的客户机端口使用、5000-65535可以被任意的服务器端口使用。地址+端口就实现了网间进程标识。
(协议、本地地址、本地端口号、远程地址、远程端口号)是一组五元相关。
●面向连结、无连接、Socket类型:
传输层中的TCP协议是面向连接的,UDP协议是无连接的,因此Socket主要有两种类型:流套接字用于TCP/IP编程,提供面向连接的服务;数据报套接字用于UDP/IP编程,提供无连接的服务。
●网络字节顺序:
不同的计算机存放多字节值的顺序不同,为保证数据的正确性,在网络协议中必须指定网络字节顺序。TCP/IP协议使用16位整数和32位整数的高位先存格式。在编程中,调用htons()和htonl()函数来转换端口(短整型数值)和地址(长整型数值)参数的字节顺序(2)Sockets编程原理
●创建套接字:用socket()来创建套接字。
●指定本地地址:用bind()来指定本地地址。
●侦听连接:面向连接的服务中,服务器套接字在socket()和bind()后,就要调用listen()来侦听客户机的请求。
●建立套接字连接:面向连接的服务中,客户机在socket()和bind()之后,要调用connect()来向服务器请求连接,服务器在侦听到客户机的请求后,要调用accept()来接受连接。
●数据传输:当一个连接建立以后,就可以传输数据了。在传输数据时,用到send()和recv()。
●输入/输出多路复用:用select()函数指定你想等待数据的套接字,当数据被套接字接收到以后,select()返回,并确定在输入队列中哪个套接字在等待数据,然后,就可以接收数据。
●关闭套接字:用closesocket()函数关闭套接字,并释放分配给该套接字的资源。
2、使用已封装好的类进行Windows Sockets编程
以上所提到的WinSock编程的方法和函数是标准Sockets调用和WinSock API所提供的,在Windows环境下使用任何编程语言、开发环境都可以实现。现在,很多开发环境都提供了已经封装好的用于Windows Sockets编程的类,这些现成的类使得WinSock的程序开发更方便、快速。
图2演示了面向连接的流套接字的工作过程;图3演示了无连接的数据报。
二实验步骤
使用TCP/IP协议编写一个聊天程序。(参见演示例子)
演示例子:
本例使用UDP协议建立一个“聊天”程序。所谓“聊天”是指两个程序能够发送数据给对方,在此两个程序之间是平等的、处于同一地位,没有服务器和客户的区别。另外,UDP程序不需建立显式的连接,所以在程序编写上比使用TCP方式简单。
建立“聊天A”程序的步骤如下:
(1)打开Visual Basic6.0中文版,创建标准工程。在工具箱上单击右键,在弹出的菜单中选择“部件”菜单项,在弹出的“部件”对话框中,选中“Miscrosoft Windows Common Controls 6.0”和”Microsoft winsock Control 6.0”两个复选框。单击“确定”按钮,所选择的控件出现在工具箱中,然后建立标准程序,并设置窗体标题为“聊天A”。(2)把Winsock控件拖放到窗体中,并设置Protocol属性为1-sckUDPProtocol,其他属性为缺省值。
(3)在窗体上放置两个标签和文本框,设置两个标签的Caption属性分别为“接收窗”
和“发送窗”。
下面编写代码:
(1)在Form-Load过程中设置网络地址,这里要设置LocalPort,RemoteHost和RemotePort 属性。为保证信息能够传送到相应程序,而按下面规则设置属性:“聊天A”的RemoteHost设置为运行“聊天B”程序的主机地址。
“聊天A”的RemotePort设置要与“聊天B”的LocalPort属性一致。
服务器的RemoteHost设置为客户程序的主机地址。
服务器的RemotePort设置要与客户LocalPort属性一致。
只有这样设置,两个程序间才能正常通信,这部分代码如下:
Private Sub Form-Load()
*设置双方网络地址
Winsock1.LocalPort=1024
Winsock1.RemoteHost=“202.99.6.101”
Winsock1.RemotePort=1997
End Sub