Windows Sockets字节排序.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Windows Sockets:字节排序本文以及另外两篇相关文章解释 Windows Sockets 编程方面的一些问题。本文介绍字节排序。其他问题在文章 Windows Sockets:阻塞和 Windows Sockets:转换字符串中介绍。如果使用CAsyncSocket类或从其派生,则您需要自己管理这些问题。如果您使用CSocket类或从其派生,则由 MFC 管理它们。字节排序不同的计算机结构有时使用不同的字节顺序存储数据。例如,基于 Intel 的计算机存储数据的顺序与 Macintosh (Motorola) 计算机相反。Intel 字节顺序称为“Little-Endian”,与网络标准“Big-Endian”顺序也相反。下表解释这些术语。Big-Endian和 Little-Endian字节排序字节排序含义Big-Endian最重要的字节在词的左端。Little-Endian最重要的字节在词的右端。通常,您不必为在网络上发送和接收的数据的字节顺序转换担心,但在有些情况下,您必须转换字节顺序。何时必须转换字节顺序在下列情况中需要转换字节顺序:传递的信息需要由网络解释(与发送到另一台计算机的数据相反)。例如,可能传递端口和地址,这些信息必须为网络理解。与之通信的服务器应用程序不是 MFC 应用程序(并且没有它的源代码)。如果两台计算机不共享相同的字节排序,则需要字节顺序转换。何时不必转换字节顺序在下列情况下可以免去转换字节顺序的工作:两端的计算机可以同意不交换字节,并且这两台计算机使用相同的字节顺序。与之通信的服务器是 MFC 应用程序。有与之通信的服务器的源代码,因此可以明确地判断是否必须转换字节顺序。可以将服务器移植到 MFC。这样做相当容易,所得到的通常是更小、更快的代码。使用CAsyncSocket时,您必须自己管理任何必需的字节顺序转换。Windows Sockets 将“Big-Endian”字节顺序模型标准化,并提供在该顺序和其他顺序之间转换的函数。然而,与CSocket一起使用的CArchive使用相反的顺序(“Little-Endian”),但CArchive为您管理字节顺序转换的细节。通过在应用程序中使用这种标准排序,或通过使用 Windows Sockets 字节顺序转换函数,可增强代码的可移植性。最适合使用 MFC 套接字的情况是当编写通信的两端时:在两端都使用 MFC。如果正在编写将与非 MFC 应用程序通信的应用程序(如 FTP 服务器),则在向存档对象传递数据前,您可能需要使用 Windows Sockets 转换例程ntohs、ntohl、htons和htonl自己管理字节交换。本文稍后将给出这些用于与非 MFC 应用程序通信的函数示例。注意当通信的另一端不是 MFC 应用程序时,也必须避免将从CObject派生的 C++ 对象以流的形式输入存档,因为接收端无法处理它们。请参见 Windows Sockets:使用带存档的套接字中的说明。有关字节顺序的更多信息,请参见 Platform SDK 中的 Windows Sockets 规范。字节顺序转换示例下面的示例显示使用存档的CSocket对象的一个序列化函数。它还阐释了在 Windows Sockets API 中如何使用字节顺序转换函数。该示例显示这样的情形:您正在编写与非 MFC 服务器应用程序通信的客户程序,而您没有访问该服务器应用程序源代码的权限。在这种情况下,必须假设非 MFC 服务器使用标准的网络字节顺序。相反,MFC 客户端应用程序对CSocket对象使用CArchive对象,而CArchive使用与网络标准相反的“Little-Endian”字节顺序。假设要与之通信的非 MFC 服务器具有如下已建立的消息包协议:struct Message { long MagicNumber; unsigned short Command; short Param1; long Param2; }; 上述内容用 MFC 术语表示则为:struct Message { long m_lMagicNumber; short m_nCommand; short m_nParam1; long m_lParam2; void Serialize ( CArchive ar ); }; 在 C++ 中,struct和类在本质上是一回事。Message 结构可以有成员函数,如以上声明的 Serialize成员函数。 Serialize 成员函数可能为如下形式: void Message::Serialize(CArchive ar) { if (ar.IsStoring()) { ar (DWORD)htonl(m_lMagicNumbe

文档评论(0)

yuguanyin2015 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档