Windows套接字系列三:使用存档进行套接字编编程

来源:互联网 发布:男生挎包 知乎 编辑:程序博客网 时间:2024/05/26 07:28

本文介绍的CSocket编程模型。CSocket类提供一个更高的抽象水平比CAsyncSocket类的套接字支持。CSocket的使用一个版本的MFC序列化协议,通过MFC CArchive对象的数据和从一个socket对象。CSocket对象提供阻塞(而管理背景的Windows消息处理),并赋予您访问CArchive的,通信管理的许多方面,你将不得不使用原始API或CAsyncSocket类做自己。

小费
可以使用CSocket类本身,作为一个更方便的CAsyncSocket的版本,但最简单的编程模型是使用CArchive对象的CSocket。
 

对于如何带存档的套接字实施的详细信息,请参见Windows Sockets的档案工作如何套接字。例如代码,请参阅Windows套接字的操作顺序和Windows Sockets:使用存档的套接字的例子。
有关从套接字类派生自己的类的功能,你可以得到一些信息,看到的Windows Sockets:从套接字类派生。

注意
如果你正在写一个MFC客户端程序的沟通,建立(非MFC)服务器,不发送C + +对象,通过归档。除非服务器是MFC应用程序,了解你要发送的对象,将无法接收和反序列化对象。
与非MFC应用程序进行通信的问题的相关材料,还可以看到文章的Windows Sockets:字节序。
 

CSocket类编程模型
使用CSocket对象涉及几个MFC类对象的创建和关联。
在下面的一般程序,每一步都采取服务器套接字和客户端套接字,除了第3步,在每个套接字类型需要不同的动作。

小费
在运行时,服务器应用程序通常在开始时首先要准备好“听”,当客户端应用程序,旨在连接。
如果还没有准备好,当客户端试图连接服务器时,通常需要用户应用程序,稍后再尝试连接。
 

要设立一个服务器套接字和客户端套接字之间的沟通
1.Construct的CSocket对象。

2,采用对象创建基础SOCKET句柄。

为CSocket的客户对象,你通常应该使用默认参数创建的,除非你需要一个数据报套接字。
一个CSocket的服务器对象,你必须在创建调用指定的端口。

注意
CArchive的数据报套接字不起作用。如果你想使用一个数据报套接字CSocket类,你必须使用的类,你会使用CAsyncSocket的,那就是,没有存档。因为数据包是不可靠的(不能保证到达和可重复或顺序),他们是不兼容的序列化,通过归档。您期望的序列化操作,可靠和顺序完成。
如果您尝试使用同一个数据报的CArchive对象的CSocket,MFC断言失败。
 

如果套接字是客户端,调用CAsyncSocket的::连接到一个服务器套接字连接套接字对象。

- 或 -

 如果套接字是服务器,调用CAsyncSocket的::听开始监听来自客户端的连接尝试。
接受一个连接请求后,调用CAsyncSocket的接受::接受。

注意
  接受成员函数需要一个新的,空的CSocket对象作为它的参数的参考。你必须建立这个对象,然后调用Accept。如果此套接字对象超出范围,则连接关闭。
不要为这个新的套接字对象调用Create。
 

4.Create CSocketFile对象,它与CSocket对象关联。

5.创建(Create)一个加载(接收)或储存(发送)数据的CArchive对象。这个
归档(CArchive)是和CSocketFile对象相关联的。

  请记住,CArchive对数据报套接字不起作用。

6.采用CArchive对象在客户端和服务器套接字之间的数据传递。

     请记住,一个给定的CArchive对象只在一个方向上移动数据:装载(接收)或存储(发送)。在某些情况下,你会使用两个CArchive对象:一个发送数据,另一个接收确认。

     在接受一个连接,并建立了存档,您可以执行验证密码等任务。

7.毁除归档,套接字文件,socket对象。

注意
  类CArchive的提供的IsBufferEmpty的成员函数,专门为使用CSocket类。例如,如果缓冲区包含多个数据信息,你需要进行循环,直到所有的这些数据都被读取并且缓冲区被清空。否则,你的下一个消息如果有数据将要接收到的话,可能会被无限等待。
使用IsBufferEmpty以确保您撷取了所有数据。 

文章的Windows Sockets:操作顺序说明双方本示例代码的过程。

有关详细信息,请参阅:

Windows套接字:流套接字

的Windows Sockets:数据报套接字

原文地址
原创粉丝点击