资源预览内容
第1页 / 共31页
第2页 / 共31页
第3页 / 共31页
第4页 / 共31页
第5页 / 共31页
第6页 / 共31页
第7页 / 共31页
第8页 / 共31页
第9页 / 共31页
第10页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
TCP/IP协议分析与应用编程,第八章 MFC套接字编程,主要内容,CAsyncSocket类 使用CAsyncSocket类编程 CSocket类 使用CSocket进行网络编程,学习目标,掌握CasyncSocket类和CSocket类的使用方法。 熟悉基于CAsyncSocket类的网络应用程序设计方法。 熟悉基于CSocket类的网络应用程序设计方法。,CAsyncSocket类,在进行网络通信时,一个套接字可以处于“阻塞模式”或“非阻塞模式”。 当一个套接字处于“阻塞模式”(即同步操作模式)时,它的阻塞函数(主要包括函数accept、connect、send、recv)直到操作完成才会返回控制权。 如果一个套接字处于“非阻塞模式”(即异步操作模式),则阻塞函数被调用后会立即返回,不需要等待所需事件的发生。,CAsyncSocket类,CAsyncSock类是一个异步套接字类,该类封装了一些基本的WinSock API函数,提供了与较底层的Windows套接字的对话接口,一般适用于有一定基础的网络编程人员使用,可以方便地进行底层的网络事件通知以及信息回叫控制等操作。其对象既可以工作在“阻塞模式”也可以工作在“非阻塞模式”。,CAsyncSocket类,CAsyncSocket类定义了一组非常有用的成员函数,这些函数的功能和格式与WinSock API函数类似。 Create函数 格式: BOOL Create ( UINT nSocketPort = 0, /套接字端口号 int nSocketType = SOCK_STREAM, /套接字类型 long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE, /事件屏蔽位 LPCTSTR lpszSocketAddress = NULL /套接字地址,IP地址或主机名 );,CAsyncSocket类,CAsyncSocket类的成员函数 AsyncSelect函数 格式: BOOL AsyncSelect ( long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE /事件屏蔽位 );,CAsyncSocket类,CAsyncSocket类的成员函数 Bind函数 格式: BOOL Bind ( UINT nSocketPort, /套接字端口号 LPCTSTR lpszSocketAddress = NULL /套接字地址,IP地址或主机名 ); 或者 BOOL Bind ( const SOCKADDR* lpSockAddr, /套接字结构地址 int nSockAddrLen /套接字结构地址长度 );,CAsyncSocket类,CAsyncSocket类的成员函数 Listen函数 格式: BOOL Listen ( int nConnectionBacklog = 5 /等待连接的最大队列长度 );,CAsyncSocket类,CAsyncSocket类的成员函数 Connect函数 格式: BOOL Connect ( LPCTSTR lpszHostAddress, /地址串型的地址参数,可以是IP地址或主机名 UINT nHostPort /端口号 ); 或者 BOOL Connect ( const SOCKADDR* lpSockAddr, / SOCKADDR类型的地址参数 int nSockAddrLen /地址参数长度 );,CAsyncSocket类,CAsyncSocket类的成员函数 Accept函数 格式: virtual BOOL Accept ( CAsyncSocket,CAsyncSocket类,CAsyncSocket类的成员函数 Receive函数 格式: virtual int Receive ( void* lpBuf, /用于存放接收的数据,称为接收缓冲区 int nBufLen, /成功接收数据的长度 int nFlags = 0 /指明数据接收方式 );,CAsyncSocket类,CAsyncSocket类的成员函数 ReceiveFrom函数 格式: int ReceiveFrom ( void* lpBuf, /接收缓冲区 int nBufLen, /所接收数据的长度 CString,CAsyncSocket类,CAsyncSocket类的成员函数 ReceiveFromEx函数 格式: int ReceiveFromEx ( void* lpBuf, /接收缓冲区 int nBufLen, /所接收数据的长度 CString,CAsyncSocket类,CAsyncSocket类的成员函数 Send函数 格式: virtual int Send ( const void* lpBuf, /待发送的数据缓冲区 int nBufLen, /待发送的数据长度 int nFlags = 0 /指明数据发送的工作方式 );,CAsyncSocket类,CAsyncSocket类的成员函数 SendTo函数 格式: int SendTo ( const void* lpBuf, /待发送的数据缓冲区 int nBufLen, /待发送的数据长度 UINT nHostPort, /远程套接字端口 LPCTSTR lpszHostAddress = NULL, /远程套接字的地址,可以是IP地址或主机名 int nFlags = 0 /指明数据发送方式 ); 或者 int SendTo ( const void* lpBuf, /待发送的数据缓冲区 int nBufLen, /待发送的数据长度 const SOCKADDR* lpSockAddr, /远程套接字结构地址 int nSockAddrLen, /远程套接字结构地址长度 int nFlags = 0 /指明数据发送方式 );,CAsyncSocket类,CAsyncSocket类的成员函数 SendToEx函数 格式: int SendToEx ( const void* lpBuf, /待发送的数据缓冲区 int nBufLen, /待发送的数据长度 UINT nHostPort, /远程套接字端口 LPCTSTR lpszHostAddress = NULL, /远程套接字的地址,可以是IP地址或主机名 int nFlags = 0 /指明数据发送方式 );,CAsyncSocket类,CAsyncSocket类的成员函数 ShutDown函数 格式: BOOL ShutDown( int nHow = sends /指明控制模式 ); Close函数 格式: virtual void Close ( );,CAsyncSocket类,CAsyncSocket类的事件响应函数 OnAccept事件响应函数 格式: virtual void OnAccept ( int nErrorCode /出错代码 ); OnClose事件响应函数 格式: virtual void OnClose ( int nErrorCode );,CAsyncSocket类,CAsyncSocket类的事件响应函数 OnConnect事件响应函数 格式: virtual void OnConnect ( int nErrorCode ); OnOutOfBandData事件响应函数 格式: virtual void OnOutOfBandData ( int nErrorCode ); OnReceive事件响应函数 格式: virtual void OnReceive ( int nErrorCode ); OnSend事件响应函数 格式: virtual void OnSend ( int nErrorCode );,使用CAsyncSocket类编程,CAsyncSocket类编程模型 基于CAsyncSocket类的字节流型套接字编程模型,使用CAsyncSocket类编程,CAsyncSocket类编程模型 基于CAsyncSocket类的数据报型套接字的编程模型,CAsyncSocket类编程实例,应用界面 实现方法 首先在CAsyncSocket类的基础上定义了一个CUDPSocket类,以对程序所需要的功能进一步封装,提供了BindLocatePC函数实现对指定IP地址和端口号的绑定,和SendToRemotePC函数实现数据发送,并在该类中对OnSend和OnReceive事件响应函数进行了重载。在此基础上,利用MFC的对话框应用程序框架建立了本实例的应用程序框架,并将CUDPSocket类加入到该框架中以实现基于UDP的通信功能。,CSocket类,CSocket是CAsyncSocket类的派生类,除了继承了父类中一些常用、易懂的Windows Sockets API函数外,还对CAsyncSocket底层中较难控制的一些函数进行了处理,提供了对比CAsyncSocket类抽象化级别更高套接字的支持。CSocket是用MFC序列化协议的一种版本,通过MFC中的CArchive对象将数据传递给套接字对象,或者从套接字对象接收数据,使得套接字上的数据输入输出就如同使用MFC的文档一样简捷易用,即CArchive管理着原来必须由用户自己使用原始API或CAsyncSocket类来管理通信的许多工作,进而方便了用户的使用,较好地解决了CAsyncSocket应用中较难克服的多线程处理问题。,CSocket类,CSocket实现了阻塞操作,其对象在调用Connect、Send、Accept、Close、Receive等成员函数时,这些函数在完成任务之后才会返回。因此,Connect和Send不会导致OnConnect和OnSend事件响应函数的调用。如果重载了OnReceive、OnAccept、OnClose事件响应函数,则在网络事件到达之后将导致对应的事件响应函数被调用。在这些事件响应函数中应该调用Receive、Accept、Close来完成相应操作。,CSocket类,CSocket主要成员函数 Create函数 格式: BOOL Create ( UINT nSocketPort = 0, /端口号 int nSocketType = SOCK_STREAM, /套接字类型 LPCTSTR lpszSocketAddress = NULL /IP地址 );,CSocket类,CSocket主要成员函数 CSocket函数 格式: CSocket ();,使用CSocket进行网络编程,CSocket对象利用Carchive对象和CSocketFile对象的数据收发示意图,使用CSocket进行网络编程,编程模型 构造一个CSocket(或其派生类)对象。 使用该对象的Create成员函数创建一个套接字对象。 如果是客户机套接字,则调用CAsyncSocket:Connect函数向服务器程序提出连接请求;如果是服务器套接字,则调用CAsyncSocket:Listen函数进入侦听状态;当接收到来自客户机程序的连接请求后,服务器程序调用CAsyncSocket:Accept函数接收请求,并创建连接套接字对象。 创建一个CSocketFile对象,并把它与CSocket(或其派生类)对象关联起来。 为接收和发送数据各产生一个CArchive对象,把它们与CSocketFile对象关联起来。 使用CArchive对象的Read、Write等函数在客户机与服务器进程之间进行数据传递。 数据传递完毕后,撤销C
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号