您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > (Visual-C程序设计及实践)第9章网络编程
第9章网络编程-2-本章目标理解计算机网络编程的概念理解TC/IP协议规范理解WindowsSockets编程规范掌握客户/服务器编程模型掌握使用CAsyncSocket类进行UDP异步编程的方法掌握使用CAsyncSocket类进行TCP异步编程的方法掌握使用CSocket类进行TCP同步编程的方法网络编程基础—网络通信基本原理地址:192.168.0.1地址:192.168.0.2协议协议端口端口网络协议就是网络之间沟通、交流的桥梁。网络协议是计算机在网络中实现通信时必须遵守的约定,是对信息传递的速率、传输代码、代码结构、传输控制步骤、出错控制等做出规定并制定出标准-3-网络编程基础—数据封装数据打包的过程称为封装,就是在数据前面加上特定的协议头部协议头数据数据-4-网络编程基础—IP地址和端口IP地址:网络中每台计算机都必须有一个唯一的IP地址,IP地址一共32位,占4个字节,常用“点分十进制”的格式来表示,例如192.168.0.16。端口:用不同的端口号来标示同一个主机中正在进行通信的不同应用程序,端口也是一个逻辑数据,共16为,占2个字节。-5-网络编程基础—套接字和字节序套接字由美国伯克利大学在Unix上推出了一种应用程序访问通信协议的调用:Socket(套接字)套接字存在于通信区域中,通信区域也叫地址族,它是一个抽象的概念,主要用于将通过套接字通信的进程的共有特性综合在一起套接字通常只与同一区域的套接字交换数据(也有可能跨区域通信,但这只在执行了某种转换进程后才能实现)。WindowsSockets只支持一个通信区域:网际域(AF_INET),这个域被使用网际协议簇通信的进程使用。套接字是一种内核对象,内核对象可以简单理解为由操作系统维护的一种数据结构。-6-网络编程基础—套接字和字节序字节序不同的计算机存放多字节值时,顺序可能会不同,有的是起始地址存放低位字节(低位先存),有的是起始地址存放高位字节(高位先存)。主机字节序:基于Intel的CPU,即常用的PC机使用的是低位先存。网络字节序:为保证数据的正确性,在网络协议中需要指定网络字节顺序,TCP/IP协议使用16位整数和32位整数的高位先存格式。-7-网络编程基础—WindowsSocketsWindowsSockets是Windows下得到广泛应用的、开放的、支持多种协议的网络编程接口从程序员的角度看WindowsSocket是一组用于网络通信的可调用的API函数。-8-网络编程基础—客户/服务器模式在TCP/IP网络通信中,两个应用程序(进程)间的通信模式是客户/服务器(Client/Server)模式。一般称等待被其他进程连接的一端为服务器,而连接其他进程的一端为客户端。客户/服务器模式的建立基于以下两点:非对等作用和通信完全是异步的。该模式在操作过程中采取的是主动请示方式。-9-网络编程基础—客户/服务器模式服务器工作过程:(1)打开一个通信信道(端口)并告知本地主机,它准备在某一个公认的地址(IP地址)上接受客户的连接请求;(2)进入监听状态,等待客户请求到达该端口;(3)接收到客户端服务请求,处理该请求并发送应答信号;(4)返回到第2步,等待另一客户端请求;(5)关闭服务器。客户端工作过程:(1)打开一个通信通道,并连接到服务器所在的特定端口;(2)向服务器发送服务请求报文,等待并接收应答,可继续提出请求;(3)请求结束后,关闭通信。-10-网络编程基础—SOCKETAPI编程Blocking和Non_blocking模式使用SocketAPI加载SocketApi库创建Socket套接字描述符绑定Socket套接字描述符监听套接字接收数据接受数据并销毁相关资源建立客户端程序-11-网络编程基础—MFC对WinSock的支持CAsyncSocket类:用于异步非阻塞通信的Socket封装类,封装了WindowsSocketsAPI函数,实现了TCP和UDP协议的通信操作,可方便地进行底层的网络事件通知及信息传输控制CSocket类:是CAsyncSocket类的派生类,用于同步阻塞通信的类。该类在内部实现了同步通信机制,用于操作通讯过程的函数和父类CAsyncSocket类同名-12-网络编程基础—MFC对WinSock的支持CAsyncSocket类和CSocket类的常用成员函数:虚函数函数说明适用协议Create()创建套接字,并绑定到指定IP地址和端口上TCP/UDPListen()进入监听状态TCPAccept()接受客户端连接,返回新的套接字TCPConnect()连接到服务器端TCPSend()发送数据TCPSendTo()发送数据UDPReceive()接收数据TCPRecieveFrom()接收数据UDPClose()关闭套接字TCPGetPeerName()获得另一端的IP地址和端口信息TCPGetSockName()获得本机绑定的IP地址和端口信息TCP/UDP-13-网络编程基础—MFC网络编程方法①包含afxsock.h文件,一般在stdafx.h文件中包含该文件,。②调用全局函数AfxSocketInit()初始化WinSock库。③创建CAsyncSocket或CSocket类的派生类。可以覆盖OnAccept()、OnRecieve()等函数以实现事件通知效果。④选择使用TCP或UDP协议进行通信。⑤创建CAsyncSocket、CSocket类或者这两个类的派生类的对象,然后调用Create()函数创建套接字。⑥通信完毕,调用Close()成员函数关闭Socket。-14-UDP通信编程—UDP异步通信使用CAsyncSocket类进行UDP进行异步编程的步骤:①创建CAsyncSocket类派生类。②创建CAsyncSocket类派生类对象。③调用Create()成员函数创建套接字(Socket),并将套接字绑定到本地IP地址和端口上。④让应用程序进入等待接收数据状态,这一步系统自动进行。⑤接收其他通信端发来的数据。⑥向其他通信端发送数据。⑦通信完毕后,关闭套接字,若是栈对象,对象在离开作用域时析构函数内自动进行关闭操作。-15-UDP通信编程—创建CAsyncSocket类派生类CAsyncSocket类是一个异步通讯类实现了事件通知机制,通过虚函数机制通知应用程序,为了使用这种虚函数机制,需要从CAsyncSocket派生子类,并重新定义相应的虚函数虚函数函数说明适用协议OnAccept()在TCP协议通信中,当服务器端收到客户端的连接请求时,该函数被框架自动调用。在子类中覆盖该函数,可以调用Accept()成员函数接受连接TCPOnRecieve()当本机缓冲区接收到数据时,该函数自动被框架调用,一般在该函数内调用Receive()或RecieveFrom()接收数据TCP/UDPOnConnect()当通讯成功建立连接后,该函数自动被框架调用TCPOnSend()当可以发送数据时,该函数自动被框架调用,一般在该函数内调用Send()成员函数发送数据TCP/UDPOnClose()当连接被关闭时,该函数自动被框架调用TCPOnOutOfBandData()当带外数据可用时,该函数自动被框架调用TCP-16-UDP通信编程—创建套接字CAsyncSocket类的派生类必须实例化对象,然后调用Create()成员函数创建套接字(Socket):nSocketPort:要绑定的端口号,若是0,表明由系统自动分配一个可用端口。nSocketType:套接字类型,SOCK_STREAM、SOCK_DGRAMlEvent:需要CAsyncSocket类关注的网络事件,lpszSocketAddress:指定要使用的本机IP地址BOOLCreate(UINTnSocketPort=0,intnSocketType=SOCK_STREAM,longlEvent=FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE,LPCTSTRlpszSocketAddress=NULL);-17-UDP通信编程—创建套接字lEvent是需要CAsyncSocket类关注的网络事件,这些事件正好对应了CAsyncSocket类的各个用于处理事件的虚函数,各个事件的用法如下:事件事件说明对应的虚函数FD_ACCEPT在TCP协议通信中,当服务器端收到客户端的连接请求时,CAsyncSocket类触发该事件。OnAccept()FD_READ当本机缓冲区接收到数据时,CAsyncSocket类触发该事件OnRecieve()FD_CONNECT当通讯成功建立连接后,CAsyncSocket类触发该事件OnConnect()FD_WRITE当可以发送数据时,CAsyncSocket类触发该事件OnSend()FD_CLOSE当连接被关闭时,CAsyncSocket类触发该事件OnClose()FD_OOB当有带外数据可用时CAsyncSocket类触发该事件OnOutOfBandData()-18-UDP通信编程—创建套接字CAsyncSocketsocket;//实例化对象//创建一个数据报(UDP)套接字,并绑定到端口3000上,//绑定到所有本机IP地址上socket.Create(3000,SOCK_DGRAM);利用CAsyncSocket类创建使用UDP协议的套接字(Socket)的示例代码如下:-19-UDP接收数据//RecieveFrom()成员函数的原型如下:intReceiveFrom(void*lpBuf,intnBufLen,CString&rSocketAddress,UINT&rSocketPort,intnFlags=0);要接收数据,只需要在其派生类中的OnRecieve()函数中调用CAsyncSocket::RecieveFrom()函数即可。其中,各参数的含义如下:lpBuf,接收数据的缓冲区地址。nBuflen,接收数据的缓冲区的大小,用字节数来表示。rSocketAddress,另一端的IP地址。rSocketPort,另一端的端口。nFlags,接收数据的标志,一般都使用0。//使用RecieveFrom()函数接收数据的示例代码如下TCHARsBuf[255]={0};//定义接收数据的缓冲区CStringsRemoteIP;//远端IPUINTnRemotePort;//远端端口//接收数据ReceiveFrom(sBuf,254*sizeof(TCHAR),sRemoteIP,nRemotePort);-20-UDP发送数据//该函数的原型如下:intSendTo(constvoid*lpBuf,intnBufLen,UINTnHostPort,LPCTSTRlpszHostAddress=NULL,intnFlags=0);使用CAsyncSocket类发送数据,只需要在需要发送数据的地方直接调用SendTo()函数即可。其中,各参数的含义如下:lpBuf,要发送数据的缓冲区地址。nBufLen,要发送的数据的字节数。nHostPort,对方的端口号。lpszHostAddress,对方的IP地址。nFlags,数据发送标志,一般为0。//使用SendTo()函数发送数据的示例代码如下:CStringstr=_T(“hello”);m_ChatSocket.SendTo(str,str.GetLength()*sizeof(TCHAR),3000,_T(“192.168.0.2”));-21-TCP通信编程—创建套接字与UDP协议不同,TCP协议通信时,首先要通过三次握手,以建立通信双方的连接。表现在编程方面,具有严格的服务器和客户端之分。服务器端需要首先处于监听状态,客户端要主动发起连接操作,服务器端接收
本文标题:(Visual-C程序设计及实践)第9章网络编程
链接地址:https://www.777doc.com/doc-2022077 .html