MFC WinSocket编程

MFC WinSocket编程


    MFC提供了两个高级类:CAsyncSocket和CSocket。
    CAsyncSocket对winsocket API进行了一对一的包装,是相对低级的一个类,需要编程者知道更多的细节。
    CSocket继承了CAsyncSocket,并扩充了大量的高级功能。主要通过和CSocketFile和CArchive两个文档类相结合,方便socket发送和接收数据。

一、CAsyncSocket
    CAsyncSocket直接从CObject派生而来,支持TCP和UDP两种传输协议。
    CAsyncSocket主要针对那些知道网络通讯细节并想利用Windows基于消息的回调功能的用户准备的。    它能很容易的控制通讯的细节因而具有很大的灵活性,效率要比CSocket高,但是需要自行处理阻塞问题,字节序不同和转化以及字符系统间的转换问题。


常用函数
1、create()   创建并配置一个socket
2、accept()   接受远端连接
3、close()   关闭socket
4、connect()   与远端建立连接
5、receive()   从连接的socket获取数据
6、send()   向连接的socket发送数据
可重载的通知函数
1、OnAccept()   当有远端连接请求发生时调用
2、OnClose()   当连接的socket关闭时调用
3、OnConnect() 完成连接时调用
4、OnReceive() 当接收数据时调用
5、OnSend()   向socket发送数据时调用


CAsyncSocket编程模式
server端:
1、构建套接字
CAsyncSocket sersock;
sersock.Create(PORT,SOCK_DGRAM|SOCK_STREAM);
   PORT—端口号 SOCK_DRAM—数据报方式(UDP) SOCK_STREAM—数据流方式(TCP)
2、启动侦听
sersock.Listen(); 当Listen侦听到客户机连接请求时,调用 MFC消息处理函数 OnAccept()
3、接受连接请求
Accept(clisock);
   clisock—CAsyncSocket的对象,客户端对象。
4、发送消息
Send(msg,msg.GetLenth(),0);
   msg—CString型数据,消息就由客户端接收。

   当完成一次发送后,应用程序框架通知套接字,缓冲区已经清空,可以通过连接的客户端对象来再次发送消息

5、接收消息
Receive(buffer,sizeof(buffer),0);
   buffer—字符数组(char*),函数返回实际接受数据的长度
   当完一次信息接收后,套接字通知应用程序,缓冲区中已经有数据可以接受下一次数据OnReceive()被调用

6、关闭服务器
sock.Close()
   一般需要先执行sersock.ShutDown();来关闭连接。


client端:
1、构建套接字
CAsyncSocket clisock;
clisock.Create();
2、连接服务器
clisock.Connect(seradd,PORT);
   seradd—服务器地址,如"127.0.0.1"、"www.daidu.com"等
   PORT—服务器端口,完成连接请求的调用后 ,无论成功与否,应用程序将调用OnConnect();
3、执行发送消息,接受消息,关闭连接等,与服务器端类似。

   基于CAsyncSocket鄙人做了个intrannet的S/C对话系统,有兴趣的朋友可以留言,我把代码共享出来^_^

二、CSocket
    CSocket简化了网络数据的输入输出,为用户维护阻塞处理的细节,它与类CSocketFile、CArchive一起来管理对数据的发送和接收。
    由于使用CSocket和CSocketFile类时运用了MFC的序列化类进行数据传输,所以client和server双方都必须用MFC来编程,或者另一方能够识别MFC序列化协议。


CSocket、CSocketFile、CArchive工作关系


   client端   server端
CArchive->CSocketFile->CSocket~~~>CSocket->CSocketFile->CArchive
   (发送消息)    NET (接收消息)

     CSocket继承自CAsyncSocket,使用的函数和通知函数都相同。

CSocket编程模式:


server端:
1、构建CSocket对象
CSocket sersock;
sersock.Create(PORT);
   PORT—端口号
2、启动侦听
sersock.Listen();
3、接受连接请求
CSocke clisock;
sersock.Accept(clisock);
   clisock—CAsyncSocket的对象,客户端对象。
   这时候不需要使用Create()。
4、创建CSocketFile和CArchive对象,用来接受和发送数据
CSocketFile file(&clisock);
CArchive arin(&file,CArchive::load); //接受数据
CArchive arout(&file,CArchive::store); //发送数据
5、发送数据、接受数据
arin>>word; //接受数据
arout<<word; //发送数据
6、关闭服务器
sersock.Close()
   一般需要先执行sersock.ShutDown();来关闭连接。


client端:
1、构建套接字
CSocket clisock;
clisock.Create();
2、连接服务器
clisock.Connect(seradd,PORT);
   seradd—服务器地址,如"127.0.0.1"、"www.daidu.com"等
   PORT—服务器端口
3、创建CSocketFile和CArchive对象,用来接受和发送数据
CSocketFile file(&clisock);
CArchive arin(&file,CArchive::load); //接受数据
CArchive arout(&file,CArchive::store); //发送数据
4、发送数据、接受数据、关闭连接与服务器端相同

已标记关键词 清除标记
相关推荐
环境:Windows XP SP 3、 VC++ 6.0、 Windows Server 2003 SDK 使用步骤: 1、下载解压之后,使用VC++ 6.0 IDE打开.dws文件 2、点击“!”按钮运行程序 3、如果一切正常会出现一个对话框,然后选择下拉框中的“服务端”启动服务器进程--接着点击“监听”按钮 4、然后再点击“!”按钮运行客户端进程 5、如果一切正常,那么选择下拉框中的“客户端”启动客户端进程--接着点击“连接”按钮,让客户端连接到socket服务器 6、在客户端的“消息”栏中输入信息,然后点击“发送”按钮 7、点击服务器端进程,应该可以看见客户端发送过来的消息,然后可以在“消息”栏中输入响应信息,然后点击“发送”按钮,此时会在客户端进程中看服务器端进程响应的信息 该示例是实现了一个客户端对象对应一个服务端对象的socket的网络编程--最简单的VC++的网络编程示例。该示使用主要是自定义一个类--它继承MFC库中CAsyncSocket类,然后重写OnAccept, OnSend, OnReceive和OnClose方法来实现一对一的VC++的socket网络编程。注意:自定义类关联应用向导生成的对话框类,需要在头文件中书写语句“class CHelloSocketDlg;”,并且在.cpp文件中写入语句“#include "HelloSocketDlg.h";”,否则编译不会通过! 本示例使用Dialog模式的UI是为方便说明socket编程,在对话框类的OnInitDialog方法有初始化的成员变量的注释说明,在自定义类中的注释非常详细。本人觉得MFC使用异步通信类CAsyncSocket实现Java中的ServerSocket类和Socket类的编程效果,是非常牛的!(虽然本人认为它还封装得不够OO--因为它封装得让使用者觉得“很傻很天真”)。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页