设为首页 加入收藏

TOP

16.4.4 使用CSocket类
2013-10-07 13:11:31 来源: 作者: 【 】 浏览:52
Tags:16.4.4 使用 CSocket

16.4.4  使用CSocket类

使用CSocket对象,需要创建CSocket对象,并将几个MFC类对象关联起来。下面的程序,服务器Sockets和客户端Sockets除了第(3)步其余每步都必须执行,其中每种Sockets类型需要不同的操作。当运行时,通常服务器应用程序先启动准备好并"监听",然后客户端应用程序发起连接。如果客户端试图连接时,服务器没有准备好,则需要客户端程序稍后再试。使用CSocket在服务器端Socket和客户端Socket之间进行通信的流程图如图16-1所示。

 
(点击查看大图)图16-1  使用CSocket在服务器端Socket和客户端Socket之间的通信步骤

结合图16-1,使用CSocket具体步骤为:

(1)构造CSocket对象。

(2)使用对象创建底层的SOCKET句柄。对于客户端CSocket对象,使用默认参数调用Create()方法就可以。对于服务器Csocket()对象,必须在Create()方法中指定端口,图17-1中服务器列的(2)步中,Create()方法的参数nPort就是服务器要监听的端口号。但是CArchive不能与数据报套接字一起使用。如果要以数据报套接字的方式使用CSocket,则不能使用档案文件。因为数据报是不可靠的,不能保证数据到达、数据不重复和顺序,因此,不能通过档案文件与序列化兼容。如果使用带有CArchive对象的CSocket类操作数据报套接字时,MFC会抛出错误。

(3)如果socket是服务器,调用CAsyncSocket::Listen开始"监听"客户端的连接。如果socket是客户端,调用CAsyncSocket::Connect连接socket对象到服务器socket。图17-1中客户端列的(3)步中,Connect方法的strAddr参数,表示要连接的服务器的地址,可以是机器地址,也可以是Internet协议地址,即IP地址。机器地址可以使用类似域名的方式,如ftp.myServer.com,而IP地址使用点号分隔符的格式,如192.168.111.1。Connect()函数会首先检查地址是否是IP地址的形式,如果不是,则会将地址作为机器地址处理。参数nPort是表示要连接的机器的端口,此处应该与服务器端SOCKET调用Create()方法使用的端口一致。

当服务器端收到连接请求,如果接收,则调用CAsyncSocket::Accept()函数。Accept成员函数需要一个新socket的引用,即空CSocket对象。用户在调用Accept()函数前,需要构造对象。如果socket对象超出范围,则连接会被关闭。MFC会连接新对象到SOCKET句柄。

(4)创建CSocketFile对象,使其与CSocket对象相连。

(5)创建用于装载(接收)或存储(发送)数据的CArchive对象,使其与CSocketFile对象相连。

(6)使用CArchive对象在客户端和服务器sockets之间传输数据。要注意,CArchive对象只能单方向存取数据。因此,有些情况下,需要使用两个CArchive对象,一个用于发送数据,另外一个用于接收。在接收连接和建立档案后,用户可以通过验证密码等操作,保证数据传输的安全性。

(7)销毁档案对象和socket对象。

CArchive类为CSocket类提供IsBufferEmpty成员函数确保接收所有数据。如果缓冲区中包含多条数据消息,则需要循环处理,读取全部数据消息,并且清空缓冲区。否则,有数据可以接收的下条通知会不确定的延期。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇16.5 MFC WinSocket实例 下一篇16.4.2 使用CAsyncSocket类

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: