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