通行证:用户名 密码 首页 - 新闻 - 免费邮箱 - 短信 - POPO - 相册 - 搜索 - 交友 - 拍卖
NetEase
新闻 | 体育 | 财经 | 娱乐 | 商业 | 科技 | 汽车 | 数码 | 女人 | 旅游 | 教育 | 文化 | 广州 | 军事 | 部落
评论 | NBA | 明星 | 证券 | 基金 | 探索 | 房产 | 手机 | 两性 | 健康 | 培训 | 电影 | 游戏 | 拍卖 | 论坛
科技首页 重磅报道 专题 IT茶馆 技术趋势 科学 学院 游戏 病毒 下载 论坛
热门搜索关键字:
WEB 学院
你现在的位置是: 网易 > 网易科技 > 网易学院·教程

Windows Sockets:使用带存档的套接字

http://tech.163.com/school · 2005-10-09 15:22:30 · 来源: MSDN

本文描述 CSocket 编程模型。CSocket 类提供了比 CAsyncSocket 类抽象化级别更高的套接字支持。CSocket 使用 MFC 序列化协议的一种版本,通过 MFC CArchive 对象将数据传递给套接字对象,或者从套接字对象传出数据。CSocket 提供阻塞(同时管理 Windows 消息的后台处理),并赋予您访问 CArchive 的权限,而 CArchive 则管理着必须由您自己使用原始 API 或 CAsyncSocket 类来管理的通信的许多方面。

提示:可以单独使用 CSocket 类作为 CAsyncSocket 的更方便版本,但最简单的编程模型是使用带 CArchive 对象的 CSocket

有关带存档的套接字实现的工作机制的更多信息,请参见 Windows Sockets:带存档的套接字的工作方式。有关示例代码,请参见 Windows Sockets:操作顺序Windows Sockets:带存档的套接字示例。有关通过从套接字类派生自己的类获得的某些功能的信息,请参见 Windows Sockets:从套接字类派生

注意:如果正在编写与已建立的(非 MFC)服务器通信的 MFC 客户程序,则不要通过存档发送 C++ 对象。除非该服务器是一个 MFC 应用程序,它知道您要发送的对象的类型,否则服务器将无法接收和反序列化这些对象。有关与非 MFC 应用程序通信的主题的相关材料,另请参见文章 Windows Sockets:字节排序
CSocket 编程模型

使用 CSocket 对象涉及创建数个 MFC 类对象并将它们关联起来。在下面的一般过程中,服务器套接字和客户端套接字都将采取每一步骤(步骤 3 除外,此步骤中每个套接字类型要求不同的操作)。

提示:在运行时,服务器应用程序通常首先做好准备然后“侦听”客户端应用程序何时寻求连接。如果客户端尝试连接时服务器未准备好,一般需要用户应用程序稍后再尝试连接。

设置服务器套接字和客户端套接字之间的通信

  1. 构造一个 CSocket 对象。
  2. 使用此对象创建基础 SOCKET 句柄。

    对于 CSocket 客户端对象,除非需要数据文报套接字,否则通常应使用默认参数来 Create 该对象。对于 CSocket 服务器对象,则必须在 Create 调用中指定端口。

    注意:CArchive 不适用于数据文报套接字。如果想将 CSocket 用于数据文报套接字,必须像使用 CAsyncSocket 那样使用该类,即不带存档。因为数据文报是不可靠的(不保证送达,并且可能重复或顺序不对),它们不能通过存档与序列化兼容。而您期望序列化操作可以可靠地、按顺序完成。如果试图将带 CArchive 对象的 CSocket 用于数据文报,则 MFC 断言失败。
  3. 如果套接字是客户端对象,则调用 CAsyncSocket::Connect 将此套接字对象连接到服务器套接字。

    - 或 -

    如果套接字是服务器端对象,则调用 CAsyncSocket::Listen 开始侦听来自客户端的连接尝试。接收到连接请求时,调用 CAsyncSocket::Accept 接受该请求。

    注意:Accept 成员函数采用对新的空 CSocket 对象的引用作为它的参数。在调用 Accept 之前,必须构造该对象。如果此套接字对象超出范围,则连接关闭。不要对这个新套接字对象调用 Create
  4. 创建一个 CSocketFile 对象,将 CSocket 对象与它关联起来。
  5. 创建一个 CArchive 对象用于加载(接收)或存储(发送)数据。此存档与 CSocketFile 对象关联。

    注意:CArchive 不适用于数据文报套接字。

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

    注意,不管是加载(接收)还是存储(发送),给定的 CArchive 对象只在一个方向上移动数据。某些情况下,需要使用两个 CArchive 对象:一个用于发送数据,一个用于接收确认。

    接受连接并设置存档后,可以执行验证密码之类的任务。

  7. 销毁存档、套接字文件和套接字对象。
    注意CArchive 类提供了专门与 CSocket 类一起使用的 IsBufferEmpty 成员函数。例如,如果缓冲区包含多条数据消息,则需要一直循环到读完所有消息和清空缓冲区。否则,下一个指示有数据要接收的通知可能会无限期延迟。使用 IsBufferEmpty 可确保检索所有数据。有关使用 IsBufferEmpty 的示例,请参见 CHATSRVR 示例应用程序。有关 MFC 示例的源代码和信息,请参见 MFC 示例。

Windows Sockets:操作顺序一文用示例代码阐释了此进程的两端。

有关更多信息,请参见:

邹妙君 [编辑:邹妙君] [返回首页]

相关文章:

推荐文章:

·赢在2007赛迪网年度企业人物榜单揭晓 ·你最需要哪种类型的视频教程 ·不用网银也网上购物 三步自助开通 ·2007年UPA用户体验大会成功闭幕 ·2007中国青年设计节暨用户体验年会在京开幕 ·User Friendly 2007现场图片 ·手机畅游互联网 空中Opera 2.0实测 ·动易软件即将全面开源和免费 ·搜图有“道” 图片达人的搜索秘籍 ·数字水墙 08年世博会亮相 ·RabbitAir MinusA2空气净化器设计 ·Oscar Bjarnason 平面设计 ·国产杀毒软件半个月内勇夺两项国际权威认证 ·美化你的博客-推荐多个博客图标下载网站 ·微软回应Vista用户遇到的网络问题“设计如此” ·eBay改进用户体验 借鉴亚马逊页面设计搜索功能 ·极点五笔6.0正式版发布 ·WPS Office 2007抢先试用 ·报告称Google Apps功能远不及微软Office ·什么是SOCK5代理,什么是HTTP代理

最新评论
  更多评论 0 条评论
网易通行证:   密码:    
参与评论
  您的发表的评论将在5分钟内被审核,请耐心等待

网易学院联系电话:020-61210163-560 合作/投稿邮箱:NeteaseSchool(at)126.com