MFC WinSocket编程

7 篇文章 0 订阅

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、发送数据、接受数据、关闭连接与服务器端相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值