⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 22.htm

📁 介绍各种平台进行SOCKET编程的好东东。
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<P>7.10 WSAGetQoSByName()&#9;</P>
<P>7.11 WSAHtonl()&#9;</P>
<P>7.12 WSAHtons()&#9;</P>
<P>7.13 WSAIoctl()&#9;</P>
<P>7.14 WSAJoinLeaf()&#9;</P>
<P>7.15 WSANtohl()&#9;</P>
<P>7.16 WSANtohs()&#9;</P>
<P>7.17 WSARecv()&#9;</P>
<P>7.18 WSARecvDisconnect()&#9;</P>
<P>7.19 WSARecvFrom()&#9;</P>
<P>7.20 WSAResetEvent()&#9;</P>
<P>7.21 WSASend()&#9;</P>
<P>7.22 WSASendDisconnect()&#9;</P>
<P>7.23 WSASendTo()&#9;</P>
<P>7.24 WSASetEvent()&#9;</P>
<P>7.25 WSASocket()&#9;</P>
<P>7.26 WSAWaitForMultipleEvents()&#9;</P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=2><P>附录</FONT><FONT SIZE=2>A </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>错误代码&#9;</P>
<P>附录</FONT><FONT SIZE=2>B Windows Sockets</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>头文件&#9;</P>
</B><P>附录</FONT><FONT SIZE=2>B.1 Windows Sockets 1.1</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>头文件&#9;</P>
<P>附录</FONT><FONT SIZE=2>B.2 Windows Sockets 2</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>头文件&#9;</P>
<P>附录</FONT><FONT SIZE=2>B.3 Winsock.def</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>文件&#9;</P>
<B><P>附录</FONT><FONT SIZE=2>C </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>参考文献&#9;</P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN"></P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=6><P> </P>
<P><A NAME="_Toc336626782"><A NAME="_Toc336792848"><A NAME="_Toc336793324">第一章</FONT><FONT SIZE=6> </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=6>简介</A></A></A></P>
</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626783"><A NAME="_Toc336792849"><A NAME="_Toc336793325"></FONT><FONT FACE="Arial" SIZE=5>1.1 </FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=5>什么是</FONT><FONT FACE="Arial" SIZE=5>Windows Sockets</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=5>规范</FONT><FONT FACE="Arial" SIZE=5>?</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN"><P>&#9;</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">规范以</FONT>U.C. Berkeley<FONT FACE="宋体" LANG="ZH-CN">大学</FONT>BSD UNIX<FONT FACE="宋体" LANG="ZH-CN">中流行的</FONT>Socket<FONT FACE="宋体" LANG="ZH-CN">接口为范例定义了一套</FONT>Micosoft Windows<FONT FACE="宋体" LANG="ZH-CN">下网络编程接口。它不仅包含了人们所熟悉的</FONT>Berkeley Socket<FONT FACE="宋体" LANG="ZH-CN">风格的库函数;也包含了一组针对</FONT>Windows<FONT FACE="宋体" LANG="ZH-CN">的扩展库函数,以使程序员能充分地利用</FONT>Windows<FONT FACE="宋体" LANG="ZH-CN">消息驱动机制进行编程。</P>
<P>&#9;</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">规范本意在于提供给应用程序开发者一套简单的</FONT>API<FONT FACE="宋体" LANG="ZH-CN">,并让各家网络软件供应商共同遵守。此外,在一个特定版本</FONT>Windows<FONT FACE="宋体" LANG="ZH-CN">的基础上,</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">也定义了一个二进制接口(</FONT>ABI<FONT FACE="宋体" LANG="ZH-CN">),以此来保证应用</FONT>Windows Sockets API<FONT FACE="宋体" LANG="ZH-CN">的应用程序能够在任何网络软件供应商的符合</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">协议的实现上工作。因此这份规范定义了应用程序开发者能够使用,并且网络软件供应商能够实现的一套库函数调用和相关语义。</P>
<P>&#9;遵守这套</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">规范的网络软件,我们称之为</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">兼容的,而</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">兼容实现的提供者,我们称之为</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">提供者。一个网络软件供应商必须百分之百地实现</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">规范才能做到现</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">兼容。</P>
<P>&#9;任何能够与</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">兼容实现协同工作的应用程序就被认为是具有</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">接口。我们称这种应用程序为</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">应用程序。</P>
<P>&#9;</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">规范定义并记录了如何使用</FONT>API<FONT FACE="宋体" LANG="ZH-CN">与</FONT>Internet<FONT FACE="宋体" LANG="ZH-CN">协议族(</FONT>IPS<FONT FACE="宋体" LANG="ZH-CN">,通常我们指的是</FONT>TCP/IP<FONT FACE="宋体" LANG="ZH-CN">)连接,尤其要指出的是所有的</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">实现都支持流套接口和数据报套接口</FONT>.</P>
<P>    <FONT FACE="宋体" LANG="ZH-CN">应用程序调用</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">的</FONT>API<FONT FACE="宋体" LANG="ZH-CN">实现相互之间的通讯。</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">又利用下层的网络通讯协议功能和操作系统调用实现实际的通讯工作。它们之间的关系如图</FONT>1-1<FONT FACE="宋体" LANG="ZH-CN">。</P>
<P><IMG SRC="Image2.gif" WIDTH=453 HEIGHT=511></P>
<P>&#9;虽然我们并不反对使用这一套</FONT>API<FONT FACE="宋体" LANG="ZH-CN">来实现另一通讯协议栈(而且我们期望在将来规范的修改中能够讨论这个问题),但这种用法已经超出了我们这一份规范所规定的范围,我们在此将不作讨论。</P>

<P> </P>
</FONT><B><FONT FACE="黑体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626784"><A NAME="_Toc336792850"><A NAME="_Toc336793326"></FONT><FONT FACE="Arial" SIZE=5>1.2 Bekeley</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=5>套接口</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN"><P>&#9;</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">规范是建立在</FONT>Bekeley<FONT FACE="宋体" LANG="ZH-CN">套接口模型上的。这个模型现在已是</FONT>TCP/IP<FONT FACE="宋体" LANG="ZH-CN">网络的标准。它提供了习惯于</FONT>UNIX<FONT FACE="宋体" LANG="ZH-CN">套接口编程的程序员极为熟悉的环境,并且简化了移植现有的基于套接口的应用程序源代码的工作。</FONT>Windows Sockets API<FONT FACE="宋体" LANG="ZH-CN">也是和</FONT>4.3BSD<FONT FACE="宋体" LANG="ZH-CN">的要求一致的。</P>
<P> </P>
</FONT><B><FONT FACE="黑体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626785"><A NAME="_Toc336792851"><A NAME="_Toc336793327"></FONT><FONT FACE="Arial" SIZE=5>1.3 Microsoft Windows</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=5>和针对</FONT><FONT FACE="Arial" SIZE=5>Windows</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=5>的扩展</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN"><P>&#9;这一套</FONT>Windows Sockets API<FONT FACE="宋体" LANG="ZH-CN">能够在所有</FONT>3.0<FONT FACE="宋体" LANG="ZH-CN">以上版本的</FONT>Windows<FONT FACE="宋体" LANG="ZH-CN">和所有</FONT>Windows Scokets<FONT FACE="宋体" LANG="ZH-CN">实现上使用,所以它不仅为</FONT>Windwos Sockets<FONT FACE="宋体" LANG="ZH-CN">实现和</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">应用程序提供了</FONT>16<FONT FACE="宋体" LANG="ZH-CN">位操作环境,而且也提供了</FONT>32<FONT FACE="宋体" LANG="ZH-CN">位操作环境。</P>
<P>&#9;</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">也支持多线程的</FONT>Windows<FONT FACE="宋体" LANG="ZH-CN">进程。一个进程包含了一个或多个同时执行的线程。在</FONT>Windows 3.1<FONT FACE="宋体" LANG="ZH-CN">非多线程版本中,一个任务对应了一个仅具有单个线程的进程。而我们在本书中所提到的线程均是指在多线程</FONT>Windows<FONT FACE="宋体" LANG="ZH-CN">环境中的真正意义的线程。在非多线程环境中(例如</FONT>Windows 3.0<FONT FACE="宋体" LANG="ZH-CN">)这个术语是指</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">进程</FONT>.</P>
<P>&#9;Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">规范中的针对</FONT>Windows<FONT FACE="宋体" LANG="ZH-CN">的扩展部分为应用程序开发者提供了开发具有</FONT>Windows<FONT FACE="宋体" LANG="ZH-CN">应用软件的功能。它有利于使程序员写出更加稳定并且更加高效的程序,也有助于在非占先</FONT>Windows<FONT FACE="宋体" LANG="ZH-CN">版本中使多个应用程序在多任务情况下更好地运作。除了</FONT>WSAStartup()<FONT FACE="宋体" LANG="ZH-CN">和</FONT>WSACleanup()<FONT FACE="宋体" LANG="ZH-CN">两个函数除外,其他的</FONT>Windows<FONT FACE="宋体" LANG="ZH-CN">扩展函数的使用不是强制性的。</P>
<P> </P>
</FONT><B><FONT FACE="黑体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626786"><A NAME="_Toc336792852"><A NAME="_Toc336793328"></FONT><FONT FACE="Arial" SIZE=5>1.4 </FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=5>这份规范的地位</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN"><P>&#9;</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">是一份独立的规范。它的产生和存在是为了造益于应用程序开发者,网络软件供应商和广大计算机用户。这份规范的每一份正式出版的版本(非草稿)实际上代表了为网络软件供应商实现所需和应用程序开发者所用的一整套</FONT>API<FONT FACE="宋体" LANG="ZH-CN">。关于这套规范的讨论和改进还正在进行之中。这样的讨论主要是通过</FONT>Internet<FONT FACE="宋体" LANG="ZH-CN">上的一个电子邮件论坛-</FONT>winsock@microdyne.com<FONT FACE="宋体" LANG="ZH-CN">进行的。同时也有不定期的会议举行。会议的具体内容会在电子邮件论坛上发表。</P>
<P> </P>
</FONT><B><FONT FACE="黑体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626787"><A NAME="_Toc336792853"><A NAME="_Toc336793329"></FONT><FONT FACE="Arial" SIZE=5>1.5 </FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=5>曾经作过的修改</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN"><P> </P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626788"><A NAME="_Toc336792854"><A NAME="_Toc336793330"></FONT><FONT SIZE=5>1.5.1 Windows Sockets 1.0</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN"><P>&#9;</FONT>Windows Sockets 1.0<FONT FACE="宋体" LANG="ZH-CN">代表了网络软件供应商和用户协会细致周到的工作的结晶。</FONT>Windows Sockets 1.0<FONT FACE="宋体" LANG="ZH-CN">规范的发布是为了让网络软件供应商和应用程序开发者能够开始建立各自的符合</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">标准的实现和应用程序。</P>
<P> </P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626789"><A NAME="_Toc336792855"><A NAME="_Toc336793331"></FONT><FONT SIZE=5>1.5.2 Windows Sockets 1.1</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN"><P>&#9;</FONT>Windows Sockets 1.1<FONT FACE="宋体" LANG="ZH-CN">继承了</FONT>Windows Sockets 1.0<FONT FACE="宋体" LANG="ZH-CN">的准则和结构,并且仅在一些绝对必要的地方作了改动。这些改动都是基于不少公司在创作</FONT>Windows Sockets 1.0<FONT FACE="宋体" LANG="ZH-CN">实现时的经验和教训的。</FONT>Windows Scokets 1.1<FONT FACE="宋体" LANG="ZH-CN">包含了一些更加清晰的说明和对</FONT>Windows Sockets 1.0<FONT FACE="宋体" LANG="ZH-CN">的小改动。此外</FONT>1.1<FONT FACE="宋体" LANG="ZH-CN">还包含了如下重大的变更:</P>
<P>&#9;</FONT>* <FONT FACE="宋体" LANG="ZH-CN">加入了</FONT>gethostname()<FONT FACE="宋体" LANG="ZH-CN">这个常规调用,以便更加简单地得到主机名字和地址。</P>
<P>&#9;</FONT>* <FONT FACE="宋体" LANG="ZH-CN">定义</FONT>DLL<FONT FACE="宋体" LANG="ZH-CN">中小于</FONT>1000<FONT FACE="宋体" LANG="ZH-CN">的序数为</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">保留,而对大于</FONT>1000<FONT FACE="宋体" LANG="ZH-CN">的序数则没有限制。这使</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">供应商可以在</FONT>DLL<FONT FACE="宋体" LANG="ZH-CN">中加入自己的界面,而不用担心所选择的序数会和</FONT>Windows Scokets<FONT FACE="宋体" LANG="ZH-CN">将来的版本冲突。</P>
<P>&#9;</FONT>* <FONT FACE="宋体" LANG="ZH-CN">增加了</FONT>WSAStartup()<FONT FACE="宋体" LANG="ZH-CN">函数和</FONT>WASClearup()<FONT FACE="宋体" LANG="ZH-CN">函数之间的关联,要求两个函数互相对应。这使得应用程序开发者和第三方</FONT>DLL<FONT FACE="宋体" LANG="ZH-CN">在使用</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">实现时不需要考虑其他程序对这套</FONT>API<FONT FACE="宋体" LANG="ZH-CN">的调用。</P>
<P>&#9;</FONT>* <FONT FACE="宋体" LANG="ZH-CN">把函数</FONT>intr_addr()<FONT FACE="宋体" LANG="ZH-CN">的返回类型,从结构</FONT>in_addr<FONT FACE="宋体" LANG="ZH-CN">改为了无符号长整型。这个改变是为了适应</FONT>Microsoft C<FONT FACE="宋体" LANG="ZH-CN">编译器和</FONT>Borland C<FONT FACE="宋体" LANG="ZH-CN">编译器对返回类型为四字节结构的函数的不同处理方法。</P>
<P>&#9;</FONT>* <FONT FACE="宋体" LANG="ZH-CN">把</FONT>WSAAsyncSelect()<FONT FACE="宋体" LANG="ZH-CN">函数语义从“边缘触发”改为“电平触发”。这种方式大大地简化了一个应用程序对这个函数的调用。</P>
<P>&#9;</FONT>* <FONT FACE="宋体" LANG="ZH-CN">改变了</FONT>ioctlsocket()<FONT FACE="宋体" LANG="ZH-CN">函数中</FONT>FIONBIO<FONT FACE="宋体" LANG="ZH-CN">的语义。如果套接口还有未完成的</FONT>WSAAsyncSelect()<FONT FACE="宋体" LANG="ZH-CN">调用,该函数将失败返回。</P>
<P>&#9;</FONT>* <FONT FACE="宋体" LANG="ZH-CN">为了符合</FONT>RFC 1122<FONT FACE="宋体" LANG="ZH-CN">,在套接口选项中加入了</FONT>TCP_NODELAY<FONT FACE="宋体" LANG="ZH-CN">这一条。</P>
<P>&#9;所有</FONT>Windows Sockets 1.1<FONT FACE="宋体" LANG="ZH-CN">对于</FONT>Windows Sockets 1.0<FONT FACE="宋体" LANG="ZH-CN">的改动在以下都作了记号。</P>
<P> </P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=6><P> </P>
<P><A NAME="_Toc336626790"><A NAME="_Toc336792856"><A NAME="_Toc336793332">第二章</FONT><FONT SIZE=6> </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=6>使用</FONT><FONT SIZE=6>Windows Sockets 1.1</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=6>编程</A></A></A></P>
</B></FONT><P>    <FONT FACE="宋体" LANG="ZH-CN">在这一章,我们将介绍如何使用</FONT>Windows Sockets 1.1<FONT FACE="宋体" LANG="ZH-CN">编程,并讨论了使用</FONT>Windows Sockets 1.1<FONT FACE="宋体" LANG="ZH-CN">编程的一些细节问题。本章的讨论均是基于</FONT>Windows Sockets 1.1<FONT FACE="宋体" LANG="ZH-CN">规范的,在某些方面可能会和第六、七章对</FONT>Windows Sockets 2<FONT FACE="宋体" LANG="ZH-CN">的讨论不一致,请读者注意这一区别。</P>
<P> </P>
</FONT><B><FONT FACE="黑体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626791"><A NAME="_Toc336792857"><A NAME="_Toc336793333"></FONT><FONT FACE="Arial" SIZE=5>2.1 Windows Sockets</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=5>协议栈安装检查</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN"><P>&#9;任何一个与</FONT>Windows Sockets Import Library<FONT FACE="宋体" LANG="ZH-CN">联接的应用程序只需简单地调用</FONT>WSAStartup()<FONT FACE="宋体" LANG="ZH-CN">函数便可检测系统中有没有一个或多个</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">实现。而对于一个稍微聪明一些的应用程序来说,它会检查</FONT>PATH<FONT FACE="宋体" LANG="ZH-CN">环境变量来寻找有没有</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">实现的实例(</FONT>Windows Sockets.DLL<FONT FACE="宋体" LANG="ZH-CN">)。对于每一个实例,应用程序可以发出一个</FONT>LoadLibrary()<FONT FACE="宋体" LANG="ZH-CN">调用并且用</FONT>WSAStartup()<FONT FACE="宋体" LANG="ZH-CN">函数来得到这个实现的具体数据。</P>
<P>&#9;这一版本的</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">规范并没有试图明确地讨论多个并发的</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">实现共同工作的情况。但这个规范中没有任何规定可以被解释成是限制多个</FONT>Windows Sockets DLL<FONT FACE="宋体" LANG="ZH-CN">同时存在并且被一个或者多个应用程序同时调用的。</P>
<P> </P>
</FONT><B><FONT FACE="黑体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626792"><A NAME="_Toc336792858"><A NAME="_Toc336793334"></FONT><FONT FACE="Arial" SIZE=5>2.2 </FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=5>套接口</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN"><P> </P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626793"><A NAME="_Toc336792859"><A NAME="_Toc336793335"></FONT><FONT SIZE=5>2.2.1 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=5>基本概念</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN"><P>&#9;通讯的基石是套接口,一个套接口是通讯的一端。在这一端上你可以找到与其对应的一个名字。一个正在被使用的套接口都有它的类型和与其相关的进程。套接口存在于通讯域中。通讯域是为了处理一般的线程通过套接口通讯而引进的一种抽象概念。套接口通常和同一个域中的套接口交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">规范支持单一的通讯域,即</FONT>Internet<FONT FACE="宋体" LANG="ZH-CN">域。各种进程使用这个域互相之间用</FONT>Internet<FONT FACE="宋体" LANG="ZH-CN">协议族来进行通讯(</FONT>Windows Sockets 1.1<FONT FACE="宋体" LANG="ZH-CN">以上的版本支持其他的域,例如</FONT>Windows Sockets 2<FONT FACE="宋体" LANG="ZH-CN">)。</P>
<P>&#9;套接口可以根据通讯性质分类;这种性质对于用户是可见的。应用程序一般仅在同一类的套接口间通讯。不过只要底层的通讯协议允许,不同类型的套接口间也照样可以通讯。</P>
<P>&#9;用户目前可以使用两种套接口,即流套接口和数据报套接口。流套接口提供了双向的,有序的,无重复并且无记录边界的数据流服务。数据报套接口支持双向的数据流,但并不保证是可靠,有序,无重复的。也就是说,一个从数据报套接口接收信息的进程有可能发现信息重复了,或者和发出时的顺序不同。数据报套接口的一个重要特点是它保留了记录边界。对于这一特点,数据报套接口采用了与现在许多包交换网络(例如以太网)非常类似的模型。</P>
<P> </P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626794"><A NAME="_Toc336792860"><A NAME="_Toc336793336"></FONT><FONT SIZE=5>2.2.2 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=5>客户机</FONT><FONT SIZE=5>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=5>服务器模型</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN"><P>&#9;一个在建立分布式应用时最常用的范例便是客户机</FONT>/<FONT FACE="宋体" LANG="ZH-CN">服务器模型。在这种方案中客户应用程序向服务器程序请求服务。这种方式隐含了在建立客户机</FONT>/<FONT FACE="宋体" LANG="ZH-CN">服务器间通讯时的非对称性。客户机</FONT>/<FONT FACE="宋体" LANG="ZH-CN">服务器模型工作时要求有一套为客户机和服务器所共识的惯例来保证服务能够被提供(或被接受)。这一套惯例包含了一套协议。它必须在通讯的两头都被实现。根据不同的实际情况,协议可能是对称的或是非对称的。在对称的协议中,每一方都有可能扮演主从角色;在非对称协议中,一方被不可改变地认为是主机,而另一方则是从机。一个对称协议的例子是</FONT>Internet<FONT FACE="宋体" LANG="ZH-CN">中用于终端仿真的</FONT>TELNET<FONT FACE="宋体" LANG="ZH-CN">。而非对称协议的例子是</FONT>Internet<FONT FACE="宋体" LANG="ZH-CN">中的</FONT>FTP<FONT FACE="宋体" LANG="ZH-CN">。无论具体的协议是对称的或是非对称的,当服务被提供时必然存在“客户进程”和“服务进程”。</P>
<P>&#9;一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户对这个服务的地址提出了连接请求。在这个时刻,服务程序被“惊醒”并且为客户提供服务-对客户的请求作出适当的反应。这一请求</FONT>/<FONT FACE="宋体" LANG="ZH-CN">相应的过程可以简单的用图</FONT>2-1<FONT FACE="宋体" LANG="ZH-CN">表示。虽然基于连接的服务是设计客户机</FONT>/<FONT FACE="宋体" LANG="ZH-CN">服务器应用程序时的标准,但有些服务也是可以通过数据报套接口提供的。</P><IMG SRC="Image3.gif" WIDTH=454 HEIGHT=370 ALIGN="LEFT" HSPACE=12>
<P> </P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P><A NAME="_Toc336626795"><A NAME="_Toc336792861"><A NAME="_Toc336793337"></FONT><FONT SIZE=5>2.2.3 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=5>带外数据</A></A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN"><P>&#9;注意:以下对于带外数据(也称为</FONT>TCP<FONT FACE="宋体" LANG="ZH-CN">紧急数据)的讨论,都是基于</FONT>BSD<FONT FACE="宋体" LANG="ZH-CN">模型而言的。用户和实现者必须注意,目前有两种互相矛盾的关于</FONT>RFC 793<FONT FACE="宋体" LANG="ZH-CN">的解释,也就是在这基础上,带外数据这一概念才被引入的。而且</FONT>BSD<FONT FACE="宋体" LANG="ZH-CN">对于带外数据的实现并没有符合</FONT>RFC 1122<FONT FACE="宋体" LANG="ZH-CN">定下的主机的要求,为了避免互操作时的问题,应用程序开发者最好不要使用带外数据,除非是与某一既成事实的服务互操作时所必须的。</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">提供者也必须提供他们的产品对于带外数据实现的语义的文挡(采用</FONT>BSD<FONT FACE="宋体" LANG="ZH-CN">方式或者是</FONT>RFC 1122<FONT FACE="宋体" LANG="ZH-CN">方式)。规定一个特殊的带外数据语义集已经超出了</FONT>Windows Sockets<FONT FACE="宋体" LANG="ZH-CN">规范的讨论范围。</P>
<P>&#9;流套接口的抽象中包括了带外数据这一概念,带外数据是相连的每一对流套接口间一个逻辑上独立的传输通道。带外数据是独立于普通数据传送给用户的,这一抽象要求带外数据设备必须支持每一时刻至少一个带外数据消息被可靠地传送。这一消息可能包含至少一个字节;并且在任何时刻仅有一个带外数据信息等候发送。对于仅支持带内数据的通讯协议来说(例如紧急数据是与普通数据在同一序列中发送的),系统通常把紧急数据从普通数据中分离出来单独存放。这就允许用户可以在顺序接收紧急数据和非顺序接收紧急数据之间作出选择(非顺序接收时可以省去缓存重叠数据的麻烦)。在这种情况下,用户也可以“偷看一眼”紧急数据。</P>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -