MFC Socket 类

来源:互联网 发布:淘宝卖家激活淘小铺 编辑:程序博客网 时间:2024/06/05 20:44

        为了方便开发人员轻松开发网络应用程序,Visual C++MFC 提供了相应的Socket 类库,主要包括 CAsyncSocket 类、CSocket 类和 CSocketFile 类。

  CAsyncSocket 类

         CAsyncSocket 对象表示一个 Windows Socket,用于表示网络通信。CAsyncSocket 类封装了 Windows Sockets API,使用面向对象技术,方便与 MFC 其他类库一起编程。

1.创建 CAsyncSocket 对象

        创建 CAsyncSocket 对象分为两步:首先调用构造函数创建一个空白的 Socket 对象,然后调用 Create 成员函数创建 SOCKET 数据结构并绑定地址。要注意的是,在服务器端应用程序的接受请求处理函数中,侦听 Socket 创建一个通信Socket 时,无须再调用Create( )函数。
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);
 
        其中,参数 nSocketPort 用于指定分配给 Socket 的端口号,默认为 0,表示由系统自动分配;参数 nSocketType 默认值为流式 Socket;参数 lEvent 为位屏蔽码,指定将为应用程序生成通知的事件集合,默认情况下所有事件都会通知;参数 lpszSocketAddress  为绑定地址,既可以设定计算机名,也可以设定 IP 地址,还可以是 DNS 地址,默认为本机地址。

        该函数如果调用成功,则返回 TRUE;否则返回 FALSE。应用程序可以通过调用GetLastError 函数获取错误描述。
        创建一个 Socket 之后,需调用 bind 成员函数将 Socket 与一个本地地址绑定。对于服务器端侦听 Socket 在接受客户端连接请求前必须选择一个端口号并绑定。

2.虚拟成员函数        

        为支持 lEvent 所代表的通知事件,MFC 通过提供虚拟成员函数轻松实现编程。例如网络应用程序要处理 FD_ACCEPT 事件,只需重载 OnAccept 函数即可。
       (1)  OnAccept:对应于 FD_ACCEPT,表示一个新的连接请求等待被接受。通过调用Accept 成员函数对客户端的连接请求进行响应。
       (2) OnClose:对应于 FD_CLOSE,表示 Socket 已关闭。
       (3) OnConnect:对应于 FD_CONNECT,表示 Socket 连接已完成,不论成功与否。它在 Connect 成员函数被调用之后才被调用。
       (4) OnOutOfBandData:对应于 FD_OOB,表示接收到带外数据,该数据通常为紧急数据。
       (5) OnReceive:对应于FD_READ,表示接收到新的数据,等待被装入。通过调用Receive成员函数接收数据。 
       (6) OnSend:对应于 FD_WRITE,表示数据已准备好以进行发送。通过调用 Send 成员函数发送数据。

 3.建立连接 

      与 Windows Sockets  API 创建网络应用程序相同,创建并绑定一个 Socket 之后,就需要建立客户端与服务器之间的连接。
(1)  客户端
      对于流式 Socket 客户端,使用 Connect 成员函数提出连接请求。它有以下两种函数
原型。
 
BOOL  Connect(LPCTSTR  lpszHostAddress,UINT nHostPort);
BOOL  Connect(const  SOCKADDR *lpSockAddr,int nSockAddrLen);
 
       其中,第一种形式的 Connect 函数参数 lpszHostAddress 为绑定地址,它是一个 ASCII字符串,例如“sunzhiyue、122.1.6.20、ftp.microsoft.com”,参数 nHostPort 为端口号。第二种形式的 Connect 函数参数与 Windows Sockets API 的 connect 函数含义相同。
       该函数如果调用成功,则返回 TRUE;否则返回 FALSE。应用程序可以通过调用GetLastError 函数以获取错误描述。
(2)  服务器端
       当服务器端创建并绑定侦听 Socket 之后,就应调用 Listen 成员函数开始侦听客户端连
接请求。当接收到客户端请求后,调用 Accept  成员函数响应请求。Accept  函数通常在
OnAccept 虚拟成员函数中调用。
      Accept 函数执行成功,将返回一个用于与客户端进行通信的 Socket。

4.收发数据

        一旦客户端与服务器成功建立 Socket 连接后,就可以进行相互通信。MFC 提供了 4个成员函数用于收发数据。
       (1) Receive:从 Socket 接收到数据。
       (2) ReceiveFrom:接收到一个数据报,并存储原地址。 
       (3) Send:向一个 Socket 发送数据。
       (4) SendTo:向一个指定目的地发送数据。

5.关闭 Socket

当 Socket 使用结束之后,就应该关闭 Socket。
(1) ShutDown:禁止发送/接收数据。
(2) Close:关闭 Socket。 

 CSocket 类

        CSocket 类是 CAsyncSocket 类的派生类,它继承了 CAsyncSocket 对 Windows Sockets API 的封装。与 CAsyncSocket 对象相比,CSocket 对象代表了 Windows Sockets API 的更高一级的抽象化,自动为应用程序处理阻塞调用。CSocket 与类 CSocketFile 和 CArchive 一起来管理对数据的发送和接收。
       与 CAsyncSocket 类相同,要创建一个 CSocket 对象,首先需要调用构造函数,然后调用 Create 成员函数创建。使用 CSocket 类实现客户端和服务器端建立 Socket 连接,以及数据收发过程,与 CAsyncSocket 类类似,不同之处如下。
        (1)  CSocket 对象不再调用通知函数 OnConnect,仅仅调用 Connect 成员函数。但是调用 Connect 函数时会发生阻塞,直到成功地建立了连接或有错误发生。调用Connect 函数的线程在 Connect 函数发生阻塞时仍能处理 Windows 的其他消息。
        (2)     CSocket 对象不再调用通知函数 OnSend,仅仅调用 Send 成员函数。但是调用 Send函数时会发生阻塞,直到所有数据都发送完毕。调用 Send 函数的线程在Send 函数发生阻塞时仍能处理 Windows 的其他消息。
        (3)  由于 CSocket  类是 CAsyncSocket  类的派生类,因此 CSocket  对象也能使用Receive/Send 和 ReceiveFrom/SendTo 收发数据。除此之外,CSocket 对象可以和CSocketFile对象一起使用串行化方法收发数据。

 CSocketFile 类

        CSocketFile 对象是一个用来通过 Windows  Sockets 在网络中发送和接收数据的 CFile对象。网络应用程序可以通过该类简化发送和接收数据流程,这需要以下两方面工作:一是将 CSocketFile 对象与一个 CSocket 对象连接,二是将 CSocketFile 对象与一个 CArchive对象连接。
        一旦 CSocketFile 对象与 CSocket 对象和 CArchive 对象建立连接,CSocketFile 对象使用方法与一般的CFile 对象使用方法就基本类似。即利用CArchive 对象来发送和接收数据。
        CArchive 对象的操作符(<<和>>)可实现对档案文件的读或写入数据,即接收或发送数据。

 

 

 

 

 

 

 

原创粉丝点击