TCPIP网络程序框架与实例

上传人:重生1****23 文档编号:369274428 上传时间:2023-11-22 格式:PPT 页数:72 大小:338.50KB
返回 下载 相关 举报
TCPIP网络程序框架与实例_第1页
第1页 / 共72页
TCPIP网络程序框架与实例_第2页
第2页 / 共72页
TCPIP网络程序框架与实例_第3页
第3页 / 共72页
TCPIP网络程序框架与实例_第4页
第4页 / 共72页
TCPIP网络程序框架与实例_第5页
第5页 / 共72页
点击查看更多>>
资源描述

《TCPIP网络程序框架与实例》由会员分享,可在线阅读,更多相关《TCPIP网络程序框架与实例(72页珍藏版)》请在金锄头文库上搜索。

1、7.1 网络应用程序的基本工作流程v7.1.1 面向连接的客户/服务器程序工作流程v1服务器端程序工作流程v工作时,在服务器端的应用程序应该首先启动,以等待客户的服务请求。其工作流程如下:v(1)使用WSAStartup()函数检查系统协议栈的安装情况。只有在协议栈正确安装的情况下,才可以执行以下的各步骤。v常用的调用格式有如下两种:vWSAStartup(0 x0202,&wsaData);vWSAStartup(MAKEWORD(2,2),&wsaData);v注意,这里所使用的Winsock为2.2版,也可以使用其他版本的Winsock。v(2)使用socket()或WSASocket(

2、)函数创建服务器端通信的套接口。如果套接口创建不成功,也不能执行以下的各步操作,并且要调用WSACleanup()函数,结束Windows Sockets API的使用。这一步调用过程确定了相关五元组的协议。v常用的调用格式有如下几种:vSOCKET serverSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);vSOCKET serverSocket=socket(AF_INET,SOCK_STREAM,0);vSOCKET serverSocket=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,

3、WSA_FLAG_OVERLAPPED);vSOCKET serverSocket=WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);v注 意,调 用 不 成 功 时 返 回INVALID_SOCKET。v(3)使用bind()函数将创建的套接口与服务器地址绑定。它确定了相关五元组中的本地IP地址和端口号。v常用调用格式如下:v bind(serverSocket,(const struct sockaddr*)&localaddr,sizeof(sockaddr);vbind(serverSocket,(SOCKADDR*

4、)&localaddr,sizeof(sockaddr);vbind(serverSocket,(sockaddr*)&localaddr,sizeof(sockaddr);vbind(serverSocket,(LPSOCKADDR)&localaddr,sizeof(sockaddr);v注意,本机地址有多种表示方法,它们是等价的。v(4)使用listen()函数使服务器套接口做好接收连接请求的准备。该函数的调用格式如下:vlisten(serverSocket,queuelen);v注意,第二个参数是请求队列的长度,用以限制排队请求的客户数,它与协议的实现有关,一般给queuelen赋值

5、为5。v(5)使用accept()或WSAAccept()函数接收来自客户端由connect()发出的连接请求。常用格式如下:vSOCKET Newsock=accept(serverSocket,(struct sockaddr*)&clientaddr,&clientaddr_len);v在该函数的参数中,由clientaddr参数返回客户端协议、IP地址和端口信息。至此,一个通信所需的五元组已建立。v(6)根据连接请求建立连接后,使用send()或WSASend()函数发送数据,或使用recv()或WSARecv()函数接收数据。调用方法见后面的实例。v(7)使用closesocket(

6、)函数关闭套接口。它的使用方法如下:vclosesocket(serverSocket);v(8)最后调用WSACleanup()函数,结束Windows Sockets API的使用。它是一个无参函数,在程序中直接调用即可,即vWSACleanup();v至此,服务器的工作过程结束。当然实际的服务器程序是比较复杂的,这里只是对它的基本流程进行了说明。v2客户端程序工作流程v客户端相对服务器端来说,其工作过程较为简单。客户端应用程序的工作流程如下:v(1)使用WSAStartup()函数检查系统协议栈的安装情况。其调用格式与服务器端是相同的,即vWSAStartup(0 x0202,&wsaD

7、ata);vWSAStartup(MAKEWORD(2,2),&wsaData);vv(2)使用socket()或WSASocket()函数创建客户端套接口。其调用格式同服务器端是一样的,即:vSOCKET clientSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);v(3)使用connect()或WSAConnect()函数发出与服务器建立连接的请求。常用格式如下:vconnect(clientSocket,(struct sockaddr*)&serveraddr,sizeof(serveraddr);v如果客户想连接的计算机没有监听指定端口的

8、进程,则请求连接的connect()调 用 就 会 失 败,并 发 生 代 码 为WSAECONNREFUSED的错误。另一种常见的错误代码是WSAETIMEDOUT,这种情况一般发生在试图连接的计算机不能用时,如客户与要连接的服务器之间路由不通、服务器主机硬件故障或者服务器不在网络上等。v注意,serveraddr参数是指向远程服务器地址的一个指针,因此要调用此函数前一定要知道远程服务器的地址和端口号,并把其值赋给serveraddr结构量,否则无法使用该函数。v (4)连接建立后,使用send()或WSASend()函数发送数据,或使用recv()或WSARecv()函数接收数据。v(5)

9、使用closesocket()函数关闭套接口。v (6)最后调用WSACleanup()函数,结束Windows Sockets API的使用。v至此,一次客户向服务器请求服务的过程结束。v3服务器与客户端五元组的建立v第6章我们讨论过服务器与客户通信的过程要用一个五元组来标识。这个五元组是:v(协议,本地IP地址,本地端口号,远程IP地址,远程端口号)v对于面向连接的(TCP协议)通信来说,服务器与客户之间的连接建立完成后,这个五元组就建立了,如表7-1所示。表7-1 面向连接的通信过程中五元组的建立 v4服务器与客户通信过程模型图v 服务器与客户进行上述通信的过程可以用图7-1表示。v要注

10、意的是,在客户端也可以使用bind()调用进行地址绑定。图7-1中数据的交换部分在实际程序中有多种可能性,图中只给出了一种服务器端先接收数据然后再发送数据的情况。图7-1 面向连接的客户/服务器程序工作模型 v7.1.2 无连接的客户/服务器程序工作流程v无连接的数据报(SOCK_DGRAM)传输服务在传输层使用UDP协议。与面向连接的通信过程不同,它的最大特点是不需要在客户和服务器之间先建立连接,通信的任何一方可以先发送数据,这样首先发送数据的一方就成了客户端,而接收数据的一方就是服务器端。在数据传输完成后,只要关闭套接口,释放网络资源,通信过程就结束了。v无连接的数据报传输服务通信时,客户

11、端与服务器端所使用的函数是类似的。其工作流程如下:v(1)使用WSAStartup()函数检查系统协议栈的安装情况。使用格式为:vWSAStartup(0 x0202,&wsaData);vWSAStartup(MAKEWORD(2,2),&wsaData);v(2)使用socket()或WSASocket()函数创建套接口,以确定相关五元组的协议。调用格式有如下几种:vSOCKET s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);vSOCKET s=socket(AF_INET,SOCK_DGRAM,0);vSOCKETvs=WSASocket(AF_INE

12、T,SOCK_DGRAM,IPPROTO_TCP,NULL,0,vWSA_FLAG_OVERLAPPED);vSOCKET s=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,vWSA_FLAG_OVERLAPPED);v(3)使用bind()函数将创建的套接口与本地地址绑定。它确定了相关五元组中的本地IP地址和端口号。常用格式如下:vbind(s,(const struct sockaddr*)&localaddr,sizeof(sockaddr);v(4)使用sendto()或WSASendTo()函数发送数据,使用recvfrom()或WSARecvFrom(

13、)函数接收数据。v(5)使用closesocket()函数关闭套接口。v(6)调用WSACleanup()函数,结束Windows Sockets API的使用。v至此,一次无连接的数据报传输过程结束。v无连接的客户与服务器之间的交互通信模型可以用图7-2表示。图7-2 无连接的客户/服务器程序工作模型v在编写无连接的客户/服务器程序时,应该注意以下几个问题:v(1)通信的一方可以不用bind()绑定IP地址和端口,而由系统自动分配。v(2)不绑定IP地址和端口的一方必须首先向绑定地址的一方发送数据。v(3)无连接应用程序也可以调用connect()函数,但是它并不向对方发出建立连接的请求,内

14、核只是将connect()中指定的目标方的IP地址和端口号记录下来,在以后的通信中就可以使用面向连接的数据发送函数send()和数据接收函数revc()。v(4)无连接的数据报传输过程中,作为服务器的一方也必须先启动,否则客户请求传不到服务进程。v(5)由于无连接的客户端一般不调用connect(),因此在数据发送之前,客户与服务器之间尚未建立一个全相关(五元组),但各自通过socket()和bind()调用建立了半相关。发送数据时,发送方除指定本地套接口的地址外,还需指定接收方套接口的地址,从而在数据收发过程中动态地建立全相关。7.2 基于TCP的客户/服务器通信程序实例 v7.2.1 实例

15、程序说明v 实例程序使用的编程环境为当前常用的Visual C+6.0。为了便于大家理解用Socket进行网络程序设计的原理,本程序使用了Visual C+6.0下的控制台程序“Win32 Console Application”。控制台程序的结构一目了然,使程序中各种Winsock API调用都非常清楚。v该程序中通信协议使用的是面向连接的TCP协议(SOCK_STREAM)。服务器端的IP地址使用系统指定的IP地址,端口号在程序中指定为5050,用符号常量来定义。v v7.2.2 服务器端程序v/*v调试环境:Visual C+6.0v服务器IP地址:由系统指定v服务器端口号:5050v程

16、序名称:server.cppv程序功能:服务器端的程序当有客户提出连接请求时,在端口5050与客户端进行TCP连接,v连接成功后,显示客户IP地址和端口号,并给客户端发送 Hello!I am a server.v字符串。如果发送正确则显示所发送的字节数v命令格式:serverv*/v#includev#includev#includev/服务器使用的端口号为5050v#define DEFAULT_PORT 5050vvoid main()vvintiPort=DEFAULT_PORT;v WSADATAwsaData;v SOCKETsListen,vsAccept;v/客户地址长度vintiLen;v/发送的数据长度vintiSend;v/要发送给客户的信息vchar buf=I am a server.;v/服务器和客户的地址vstruct sockaddr_inser,vcli;vprintf(-n);vprintf(Server waitingn);vprintf(-n);vif(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)vv printf

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > 教育/培训/课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号