《TCP IP协议与网络编程》课件第7章 TCP网络程序框架与实例.ppt

上传人(卖家):momomo 文档编号:7862571 上传时间:2024-08-28 格式:PPT 页数:73 大小:360KB
下载 相关 举报
《TCP IP协议与网络编程》课件第7章 TCP网络程序框架与实例.ppt_第1页
第1页 / 共73页
《TCP IP协议与网络编程》课件第7章 TCP网络程序框架与实例.ppt_第2页
第2页 / 共73页
《TCP IP协议与网络编程》课件第7章 TCP网络程序框架与实例.ppt_第3页
第3页 / 共73页
《TCP IP协议与网络编程》课件第7章 TCP网络程序框架与实例.ppt_第4页
第4页 / 共73页
《TCP IP协议与网络编程》课件第7章 TCP网络程序框架与实例.ppt_第5页
第5页 / 共73页
点击查看更多>>
资源描述

1、第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例7.1 7.1 网络应用程序的基本工作流程网络应用程序的基本工作流程7.2 7.2 基于基于TCPTCP的客户的客户/服务器通信程序实例服务器通信程序实例7.3 7.3 基于基于UDPUDP的客户与服务器通信程序实例的客户与服务器通信程序实例习题习题 第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例7.1 网络应用程序的基本工作流程网络应用程序的基本工作流程7.1.1 面向连接的客户/服务器程序工作流程1服务器端程序工作流程工作时,在服务器端的应用程序应该首先启动

2、,以等待客户的服务请求。其工作流程如下:(1)使用WSAStartup()函数检查系统协议栈的安装情况。只有在协议栈正确安装的情况下,才可以执行以下的各步骤。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例常用的调用格式有如下两种:WSAStartup(0 x0202,&wsaData);WSAStartup(MAKEWORD(2,2),&wsaData);注意,这里所使用的Winsock为2.2版,也可以使用其他版本的Winsock。(2)使用socket()或WSASocket()函数创建服务器端通信的套接口。如果套接口创建不成功,也不能执行以下的各步操作,并且要调用WSACl

3、eanup()函数,结束Windows Sockets API的使用。这一步调用过程确定了相关五元组的协议。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例常用的调用格式有如下几种:SOCKET serverSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);SOCKET serverSocket=socket(AF_INET,SOCK_STREAM,0);SOCKET serverSocket=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED);SOC

4、KET serverSocket=WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);注意,调用不成功时返回INVALID_SOCKET。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例(3)使用bind()函数将创建的套接口与服务器地址绑定。它确定了相关五元组中的本地IP地址和端口号。常用调用格式如下:b i n d(s e r v e r S o c k e t,(c o n s t s t r u c t sockaddr*)&localaddr,sizeof(sockaddr);bind(serverSoc

5、ket,(SOCKADDR*)&localaddr,sizeof(sockaddr);bind(serverSocket,(sockaddr*)&localaddr,sizeof(sockaddr);bind(serverSocket,(LPSOCKADDR)&localaddr,sizeof(sockaddr);注意,本机地址有多种表示方法,它们是等价的。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例(4)使用listen()函数使服务器套接口做好接收连接请求的准备。该函数的调用格式如下:listen(serverSocket,queuelen);注意,第二个参数是请求队列的长

6、度,用以限制排队请求的客户数,它与协议的实现有关,一般给queuelen赋值为5。(5)使用accept()或WSAAccept()函数接收来自客户端由connect()发出的连接请求。常用格式如下:SOCKET Newsock=accept(serverSocket,(struct sockaddr*)&clientaddr,&clientaddr_len);在该函数的参数中,由clientaddr参数返回客户端协议、IP地址和端口信息。至此,一个通信所需的五元组已建立。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例(6)根据连接请求建立连接后,使用send()或WSASend

7、()函数发送数据,或使用recv()或WSARecv()函数接收数据。调用方法见后面的实例。(7)使用closesocket()函数关闭套接口。它的使用方法如下:closesocket(serverSocket);(8)最后调用WSACleanup()函数,结束Windows Sockets API的使用。它是一个无参函数,在程序中直接调用即可,即WSACleanup();至此,服务器的工作过程结束。当然实际的服务器程序是比较复杂的,这里只是对它的基本流程进行了说明。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例2客户端程序工作流程客户端相对服务器端来说,其工作过程较为简单。客户

8、端应用程序的工作流程如下:(1)使用WSAStartup()函数检查系统协议栈的安装情况。其调用格式与服务器端是相同的,即WSAStartup(0 x0202,&wsaData);WSAStartup(MAKEWORD(2,2),&wsaData);第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例(2)使用socket()或WSASocket()函数创建客户端套接口。其调用格式同服务器端是一样的,即:SOCKET clientSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);(3)使用connect()或WSAConnect()函数发出与

9、服务器建立连接的请求。常用格式如下:c o n n e c t(c l i e n t S o c k e t,(s t r u c t sockaddr*)&serveraddr,sizeof(serveraddr);第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例如果客户想连接的计算机没有监听指定端口的进程,则请求连接的connect()调用就会失败,并发生代码为WSAECONNREFUSED的错误。另一种常见的错误代码是WSAETIMEDOUT,这种情况一般发生在试图连接的计算机不能用时,如客户与要连接的服务器之间路由不通、服务器主机硬件故障或者服务器不在网络上等。注意,se

10、rveraddr参数是指向远程服务器地址的一个指针,因此要调用此函数前一定要知道远程服务器的地址和端口号,并把其值赋给serveraddr结构量,否则无法使用该函数。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例 (4)连接建立后,使用send()或WSASend()函数发送数据,或使用recv()或WSARecv()函数接收数据。(5)使用closesocket()函数关闭套接口。(6)最后调用WSACleanup()函数,结束Windows Sockets API的使用。至此,一次客户向服务器请求服务的过程结束。3服务器与客户端五元组的建立第6章我们讨论过服务器与客户通信的过

11、程要用一个五元组来标识。这个五元组是:第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例(协议,本地IP地址,本地端口号,远程IP地址,远程端口号)对于面向连接的(TCP协议)通信来说,服务器与客户之间的连接建立完成后,这个五元组就建立了,如表7-1所示。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例表7-1 面向连接的通信过程中五元组的建立 五元组 服务器端五元组 由 socket()确定 由服务器端调用 bind()时确定 由 accept()确定 客户端五元组 由 socket()确定 由客户端的 bind()调用确定。如果客户端没有进行 bind()调用,或调用

12、了 bind()但没有指定具体地址或端口,则由系统内核自动确定地址和 端口 由 connect()确定 第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例4服务器与客户通信过程模型图 服务器与客户进行上述通信的过程可以用图7-1表示。要注意的是,在客户端也可以使用bind()调用进行地址绑定。图7-1中数据的交换部分在实际程序中有多种可能性,图中只给出了一种服务器端先接收数据然后再发送数据的情况。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例WSAStartup()socket()bind()listen()accept()等待客户连接请求的到来recv()send()

13、closesocket()WSACleanup()用三次握手过程建立TCP连接send()recv()closesocket()WSACleanup()关闭TCP连接交换数据交换数据connect()socket()WSAStartup()图7-1 面向连接的客户/服务器程序工作模型 第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例7.1.2 无连接的客户/服务器程序工作流程无连接的数据报(SOCK_DGRAM)传输服务在传输层使用UDP协议。与面向连接的通信过程不同,它的最大特点是不需要在客户和服务器之间先建立连接,通信的任何一方可以先发送数据,这样首先发送数据的一方就成了客户端

14、,而接收数据的一方就是服务器端。在数据传输完成后,只要关闭套接口,释放网络资源,通信过程就结束了。无连接的数据报传输服务通信时,客户端与服务器端所使用的函数是类似的。其工作流程如下:第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例(1)使用WSAStartup()函数检查系统协议栈的安装情况。使用格式为:WSAStartup(0 x0202,&wsaData);WSAStartup(MAKEWORD(2,2),&wsaData);(2)使用socket()或WSASocket()函数创建套接口,以确定相关五元组的协议。调用格式有如下几种:SOCKET s=socket(AF_INE

15、T,SOCK_DGRAM,IPPROTO_UDP);SOCKET s=socket(AF_INET,SOCK_DGRAM,0);SOCKET第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例s=WSASocket(AF_INET,SOCK_DGRAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED);SOCKET s=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED);第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例(3)使用bind()函数将创建的套接口与本地地址绑定。它确定

16、了相关五元组中的本地IP地址和端口号。常用格式如下:bind(s,(const struct sockaddr*)&localaddr,sizeof(sockaddr);(4)使用sendto()或WSASendTo()函数发送数据,使用recvfrom()或WSARecvFrom()函数接收数据。(5)使用closesocket()函数关闭套接口。(6)调用WSACleanup()函数,结束Windows Sockets API的使用。至此,一次无连接的数据报传输过程结束。无连接的客户与服务器之间的交互通信模型可以用图7-2表示。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例W

17、SAStartup()socket()bind()recvfrom()sendto()closesocket()WSACleanup()交换数据交换数据WSAStartup()socket()bind()sendto()recvfrom()closesocket()WSACleanup()图7-2 无连接的客户/服务器程序工作模型第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例在编写无连接的客户/服务器程序时,应该注意以下几个问题:(1)通信的一方可以不用bind()绑定IP地址和端口,而由系统自动分配。(2)不绑定IP地址和端口的一方必须首先向绑定地址的一方发送数据。(3)无连接

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

19、址外,还需指定接收方套接口的地址,从而在数据收发过程中动态地建立全相关。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例7.2 基于基于TCP的客户的客户/服务器通信程序实例服务器通信程序实例 7.2.1 实例程序说明 实例程序使用的编程环境为当前常用的Visual C+6.0。为了便于大家理解用Socket进行网络程序设计的原理,本程序使用了Visual C+6.0下的控制台程序“Win32 Console Application”。控制台程序的结构一目了然,使程序中各种Winsock API调用都非常清楚。该程序中通信协议使用的是面向连接的TCP协议(SOCK_STREAM)。

20、服务器端的IP地址使用系统指定的IP地址,端口号在程序中指定为5050,用符号常量来定义。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例7.2.2 服务器端程序/*调试环境:Visual C+6.0服务器IP地址:由系统指定服务器端口号:5050程序名称:server.cpp程序功能:服务器端的程序当有客户提出连接请求时,在端口5050与客户端进行TCP连接,第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例连接成功后,显示客户IP地址和端口号,并给客户端发送 Hello!I am a server.字符串。如果发送正确则显示所发送的字节数命令格式:server*/#i

21、nclude#include#include/服务器使用的端口号为5050#define DEFAULT_PORT 5050void main()第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例intiPort=DEFAULT_PORT;WSADATAwsaData;SOCKETsListen,sAccept;/客户地址长度intiLen;/发送的数据长度intiSend;/要发送给客户的信息char buf=I am a server.;第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例/服务器和客户的地址struct sockaddr_inser,cli;printf

22、(-n);printf(Server waitingn);printf(-n);if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)printf(Failed to load Winsock.n);return;第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例/创建服务器端套接口sListen=socket(AF_INET,SOCK_STREAM,0);if(sListen=INVALID_SOCKET)p r i n t f(s o c k e t()F a i l e d:%d n ,WSAGetLastError();return;/以下建立服务

23、器端地址 ser.sin_family=AF_INET;第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例/htons()函数把一个双字节主机字节顺序的数转换为网络字节顺序的数ser.sin_port=htons(iPort);/htonl()函数把一个四字节主机字节顺序的数转换为网络字节顺序的数/使用系统指定的IP地址INADDR_ANYser.sin_addr.s_addr=htonl(INADDR_ANY);if(bind(sListen,(LPSOCKADDR)&ser,sizeof(ser)=SOCKET_ERROR)p r i n t f(b i n d()F a i l

24、 e d:%d n ,WSAGetLastError();return;第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例/进入监听状态if(listen(sListen,5)=SOCKET_ERROR)printf(listen()Failed:%dn,WSAGetLastError();return;/初始化客户地址长度参数iLen=sizeof(cli);/进入一个无限循环,等待客户的连接请求第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例while(1)s A c c e p t=a c c e p t(s L i s t e n,(s t r u c t soc

25、kaddr*)&cli,&iLen);if(sAccept=INVALID_SOCKET)printf(accept()Failed:%dn,WSAGetLastError();break;第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例/输出客户IP地址和端口号printf(Accepted client IP:%s,port:%dn,inet_ntoa(cli.sin_addr),ntohs(cli.sin_port);/给连接的客户发送信息iSend=send(sAccept,buf,sizeof(buf),0);if(iSend=SOCKET_ERROR)p r i n t

26、 f(s e n d()F a i l e d.:%d n ,WSAGetLastError();break;第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例elseif(iSend=0)break;elsep r i n t f(s e n d()byte:%dn,iSend);printf(-n);closesocket(sAccept);closesocket(sListen);WSACleanup();第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例7.2.3 客户端程序/*调试环境:VC+6.0程序名称:client.cpp客户IP地址和端口:由系统指定程序功

27、能:客户端程序向服务器提出TCP连接的请求,当连接建立后,从服务器的端口5050第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例接收数据并进行显示,然后断开与服务器的连接命令格式:client 服务器IP地址命令举例:client 192.168.0.1说 明:上 面 设将要连接的服务器 I P 地 址 为192.168.0.1,端口号为5050*/第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例#include#include/服务器端口号为5050#define DEFAULT_PORT 5050#define DATA_BUFFER 1024void main(i

28、nt argc,char*argv)WSADATAwsaData;SOCKETsClient;int iPort=DEFAULT_PORT;第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例/从服务器端接收的数据长度 int iLen;/接收数据的缓冲 charbufDATA_BUFFER;/服务器端地址 struct sockaddr_in ser;/判断输入的参数是否正确第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例 if(argc2)/提示在命令行中输入服务器IP地址printf(Usage:client

29、 server IP addressn);return;/接收数据的缓冲区初始化 memset(buf,0,sizeof(buf);if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)printf(Failed to load Winsock.n);return;第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例/填写要连接的服务器地址信息ser.sin_family=AF_INET;ser.sin_port=htons(iPort);/inet_addr()函数将命令行的点分IP地址转化为用二进制表示的网络字节顺序的IP地址ser.sin_addr.s

30、_addr=inet_addr(argv1);/建立客户端流式套接口sClient=socket(AF_INET,SOCK_STREAM,0);if(sClient=INVALID_SOCKET)第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例printf(socket()Failed:%dn,WSAGetLastError();return;/请求与服务器端建立TCP连接i f(c o n n e c t(s C l i e n t,(s t r u c t sockaddr*)&ser,sizeof(ser)=INVALID_SOCKET)printf(connect()Fai

31、led:%dn,WSAGetLastError();return;第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例else/从服务器端接收数据iLen=recv(sClient,buf,sizeof(buf),0);if(iLen=0)return;else if(iLen=SOCKET_ERROR)第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例printf(recv()Failed:%dn,WSAGetLastError();return;printf(recv()data from server:%sn,buf);closesocket(sClient);WSAC

32、leanup();第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例7.2.4 程序执行结果进行编译与链接前,要注意以下几个问题:(1)在Visual C+6.0的“工程”“设置”“工程设置(Project Settings)”“Link”“对象/库模块”中加入“ws2_32.lib”。(2)执行VC+安装目录下文件夹“bin”中的“Vcvars32.bat”批处理文件。(3)如果要在一台计算机上调试服务器和客户程序,则服务器程序和客户程序应该各开一个DOS窗口,并在其中显示命令。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例(4)服务器端程序在没有错误发生或强行终止(

33、Ctrl+Break)的情况下,将一直运行下去。图7-3和图7-4是客户端程序和服务器端程序执行的结果,它们是在同一台装有Windows 98操作系统的主机上执行后的结果。该主机的IP地址设置为“192.168.0.1”。客户端程序共执行了三次,每执行一次,服务器端程序就显示与其建立连接的客户端IP地址和端口号并显示发送给客户的字节数。由于客户端端口号由主机进行分配,所以从图7-4中可以看出,每次执行时主机都分配了不同的端口号。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例图7-3 客户端程序执行结果 第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例图7-4 服务器端

34、程序执行结果 第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例7.3 基于UDP的客户与服务器通信程序实例7.3.1 实例程序说明本实例程序使用的编程环境为Visual C+6.0,使用的是控制台程序“Win32 Console Application”。通信协议使用无连接的UDP协议(SOCK_DGRAM)。服务器端IP地址使用系统指定的IP地址,端口号在程序中指定为5050,用符号常量定义。服务器端从客户端接收并显示信息,服务器也向客户端发送“Hello!I am a server.”信息。客户端向服务器发送的信息为“Hello!I am a client.”,同时也接收从服务

35、器发送的信息并进行显示。客户端程序执行时,从键盘输入服务器的IP地址(即在命令行中输入),客户端口号由系统指定,服务器端口号指定为5050。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例7.3.2 服务器端程序/*调试环境:VC+6.0程序名称:server.cpp服务器IP地址:由系统指定服务器端口:5050功能:从端口5050接收客户端发送来的数据,接收成功后显示从客户端收到的数据、客户端的IP地址和端口号;给客户端发送Hello!I am a server.字符串命令格式:server*/第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例#include#incl

36、ude#include/服务器端口号为5050#define DEFAULT_PORT 5050/接收数据缓冲区长度#define BUFFER_LENGTH 1024void main()第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例 intiPort=DEFAULT_PORT;WSADATAwsaData;SOCKETsSocket;/客户地址长度 intiLen;/发送的数据长度 intiSend;/接收的数据长度 intiRecv;第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例/要发送给客户的信息 charsend_buf=Hello!I am a serv

37、er.;/接收数据的缓冲区 charrecv_bufBUFFER_LENGTH;/本地地址和客户地址 struct sockaddr_inser,cli;printf(-n);printf(Server waitingn);printf(-n);第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例 if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)printf(Failed to load Winsock.n);return;/产生服务器端套接口 sSocket=socket(AF_INET,SOCK_DGRAM,0);if(sSocket=INVALI

38、D_SOCKET)printf(socket()Failed:%dn,WSAGetLastError();return;第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例/以下建立服务器端地址 ser.sin_family=AF_INET;/htons()函数把一个双字节主机字节顺序的数转换为网络字节顺序的数 ser.sin_port=htons(iPort);/htonl()函数把一个主机字节顺序的数转换为网络字节顺序的数 ser.sin_addr.s_addr=htonl(INADDR_ANY);if(bind(sSocket,(LPSOCKADDR)&ser,sizeof(se

39、r)=SOCKET_ERROR)p r i n t f(b i n d()F a i l e d:%d n ,WSAGetLastError();return;第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例 iLen=sizeof(cli);/初始化接收缓冲区 memset(recv_buf,0,sizeof(recv_buf);/进入一个无限循环,进行数据接收和发送 while(1)/从客户端接收数据iRecv=recvfrom(sSocket,recv_buf,BUFFER_LENGTH,0,(SOCKADDR*)&cli,&iLen);第第7章章 TCP/IP网络程序框架与

40、实例网络程序框架与实例if(iRecv=SOCKET_ERROR)printf(recvfrom()Failed.:%dn,WSAGetLastError();break;elseif(iRecv=0)break;else第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例/输出接收到的数据printf(recvfrom():%sn,recv_buf);/输出客户IP地址和端口号printf(Accepted client IP:%s,port:%dn,inet_ntoa(cli.sin_addr),ntohs(cli.sin_port);第第7章章 TCP/IP网络程序框架与实例网络

41、程序框架与实例/给客户发送信息iSend=sendto(sSocket,send_buf,sizeof(send_buf),0,(SOCKADDR*)&cli,sizeof(cli);if(iSend=SOCKET_ERROR)printf(sendto()Failed.:%dn,WSAGetLastError();printf(-n);break;第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例elseif(iSend=0)break;elseprintf(sendto()succeeded!n);printf(-n);closesocket(sSocket);WSACleanu

42、p();第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例7.3.3 客户端程序/*调试环境:VC+6.0程序名称:client.cpp客户端IP地址和端口:由系统指定程序功能:客户端程序向服务器发送数据Hello!I am a client.;客户端程序从服务器接收数据并进行显示命令格式:client 服务器IP地址命令举例:client 192.168.0.1说明:上面设要给IP地址为192.168.0.1、端口号为5050的服务器发送数据*/第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例#include#include/服务器端口号为5050#define DEF

43、AULT_PORT 5050/缓冲区长度#define DATA_BUFFER 1024void main(int argc,char*argv)WSADATA wsaData;SOCKET sClient;第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例int iPort=5050;/服务器地址长度 int iLen;/接收数据的缓冲 int iSend;int iRecv;/要发送给服务器的信息 char send_buf=Hello!I am a client.;/接收数据的缓冲区 char recv_bufDATA_BUFFER;第第7章章 TCP/IP网络程序框架与实例网

44、络程序框架与实例/服务器端地址 struct sockaddr_in ser;/处理命令行中输入的参数 if(argc2)/提示在命令行中输入服务器IP地址printf(Usage:client server IP addressn);return;第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例 /接收数据的缓冲区初始化 memset(recv_buf,0,sizeof(recv_buf);if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)printf(Failed to load Winsock.n);return;第第7章章 TCP/IP网络程

45、序框架与实例网络程序框架与实例/建立服务器端地址 ser.sin_family=AF_INET;ser.sin_port=htons(iPort);ser.sin_addr.s_addr=inet_addr(argv1);/建立客户端数据报套接口 sClient=socket(AF_INET,SOCK_DGRAM,0);if(sClient=INVALID_SOCKET)printf(socket()Failed:%dn,WSAGetLastError();return;第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例 iLen=sizeof(ser);/向服务器发送数据 iSen

46、d=sendto(sClient,send_buf,sizeof(send_buf),0,(struct sockaddr*)&ser,iLen);if(iSend=SOCKET_ERROR)printf(sendto()Failed:%dn,WSAGetLastError();return;else if(iSend=0)return;else第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例printf(snedto()succeeded.n);/从服务器接收数据 iRecv=recvfrom(sClient,recv_buf,sizeof(recv_buf),0,(struct

47、 sockaddr*)&ser,&iLen);if(iRecv=SOCKET_ERROR)printf(recvfrom()Failed.:%dn,WSAGetLastError();return;第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例 else if(iRecv=0)return;else/显示从服务器收到的信息printf(recvfrom():%sn,recv_buf);printf(-n);closesocket(sClient);WSACleanup();第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例7.3.4 程序执行结果 服务器端程序同样要先执

48、行,图7-5和图7-6分别是服务器端程序和客户端程序执行后的结果。它们是在同一台装有Windows 98操作系统的主机上执行的。该主机的IP地址设置为“192.168.0.1”。客户端程序共执行了三次。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例图7-5 服务器端程序执行结果第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例图7-6 客户端程序执行结果 第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例第一次执行:没有输入服务器的IP地址,则显示命令用法后返回,可以输入服务器的IP后再执行。第二次执行:输入正确的命令行格式,则显示数据成功发送的提示信息,然后

49、显示从服务器收到的信息。服务器则显示从客户端收到的信息“Hello!I am a client.”,然后显示客户端的IP地址和端口号,最后显示数据成功发送的提示信息。第三次:输入正确的命令行格式,但注意服务器所显示的端口号与前一次执行时不同,因为客户的端口号由系统自动分配。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例习题习题 1简述面向连接的客户/服务器程序的工作流程。2简述无连接的客户/服务器程序的工作流程。3编写基于TCP协议(有连接)的客户/服务器通信程序,具体要求如下:(1)服务器的IP地址由系统指定,端口号使用5555,功能是把从客户端收到的信息原样转发给客户端程序。(2)客户机的IP地址和端口号都由系统指定,功能是服务器发送“I am a client.”,并把从服务器上收到的信息显示在屏幕上(回声程序)。4用基于UDP的协议实现第3题的程序。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(《TCP IP协议与网络编程》课件第7章 TCP网络程序框架与实例.ppt)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|