网络编程 C++ ———MFC Socket

来源:互联网 发布:淘宝详情页切图 编辑:程序博客网 时间:2024/06/06 02:26

                                  网络编程 C++ ———MFC Socket


                          MFC 中封装了CAsyncSokect 类和CSocket类 ,置于类库之中。CAsyncSokect 类要求程序员对网络通信和套接字编程模式有相当的理解,要程序员机子编程处理阻塞、字节顺序以及Unicode与MBCS之间的转换问题。  CSocket类则比较简单 ,同与之搭配的CSocketFile类和CAchive类编写网络程序更加简单便利。


   CAsyncSokect 编程

                1)创建Socket 

           构造CAsyncSokect类,再调用其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 );
    对于服务器必须指定端口,客户端不指定的话系统自己分配。


例子说明:

CAsyncSokect ssocket;int port=27;ssocket.Create(port,SOCK_DRAM);
创建一个数据报套接字 。

CAsyncSokect  * psserver= new CAsyncSocket ;int port=27;psscoket->Create(port);
创建一个流式套接字。


CAsyncSokect ClientSocket ;ClientSocket.Create();
为客户端创建一个流式套接字 。


MFC 定义了一个内部类CSocketWnd,当调用Create函数创建一个套接字时,就会将该套接字连接到一个窗口(CsocketWnd 对象),CAsyncSokect的回调函数DoCallBack函数为该窗口的回调函数。这样当一个网络事件发生时,经过MFC的消息循环,DoCallBack函数会根据不同的事件调用响应的处理函数。MFC将这些函数定义为虚函数,在编程是必须重载需要的消息处理函数。


2) 客户端连接和服务端监听 

ClientSocket.Connect(addr,port);


ServerSocket.Listen();

ServerSocket.Accpet(CAsyncSokect & rConnectedsocket);


3) 数据收发 

Send ()  、Sendto() 、Receive()ReceiveFrom()




CSocket 编程 

        CSocket 是CAsyncSokect的派生类 。

1) 创建Socket 

Create()函数继承CAsyncSokect的Create()函数 ; 也是一样先构造对象,再调用Create()方法创建套接字。

服务器端: 

CSocket sockSrv;

sockSrv.Create(port);

 

客户端 :

CSocket sockClient ;

sockClient.Create();


2)连接与监听 

 同CAsyncSokect 一样 。

服务器端:

sockSrv.Listen();

CSocket sockRecv ;

sockSrv.Accept(sockRecv);


客户端:

sockClient.Connect(strAddr,port);


3)数据传输 

服务端程序 :

// 创建与CSocket类的对象相连接的CSocketFile类对象。

CSocketFile file(&sockRecv);

//创建与CSocketFile类的对象相连接的CAchive类对象,用于存放要发送的数据 ;

CAchive arin(&file,CAchive ::load);

//创建与CSocketFile类的对象相连接的CAchive类对象,用于存放接收的数据 ;

CAchive arout(&file,CAchive ::load);

arin>>dwValue;                                            //发送数据dwVlaue

arout<<dwValue;                                        // 接收数据dwVlaue


客户端程序:

// 创建与CSocket类的对象相连接的CSocketFile类对象。

CSocketFile file(&sockClient);

//创建与CSocketFile类的对象相连接的CAchive类对象,用于存放要发送的数据 ;

CAchive arin(&file,CAchive ::load);

//创建与CSocketFile类的对象相连接的CAchive类对象,用于存放接收的数据 ;

CAchive arout(&file,CAchive ::load);

arin>>dwValue;                                            //发送数据dwVlaue

arout<<dwValue;                                        // 接收数据dwVlaue


4) 释放资源 

 网络通信结束后,对于栈中的类对象会自动调用其析构函数。 对于队中的则需要delete 手动释放 。


除了利用CSocketFile 类的对象和CAchive类的对象辅助数据传输外,利用CSocket的成员函数(Send ()、SendTo()、Receive()、ReceiveFrom())同样可以实现数据传输。