Windows套接字错误代码说明

WSAEINTR (10004)

  • 翻译: 中断函数调用。
  • 说明: 阻止操作被中断通过调用 WSACancelBlockingCall (Wsapiref_704y.asp)。

WSAEACCES (10013)

  • 翻译: 权限被拒绝。
  • 说明: 尝试访问套接字访问权限被禁止的方式。例如,广播的地址可用于发送到但广播的权限未设置通过使用 setsockopt(SO_BROADCAST) 时,将发生此错误。另一个可能导致 WSAEACCES 错误的原因是,当调用绑定 (Wsapiref_6vzm.asp) 函数 (在 Microsoft Windows NT 4.0 Service Pack 4 [SP4] 或更高版本),另一个程序、 服务或内核模式驱动程序绑定到同一地址具有独占访问权。这种独占的访问是一项新功能的 Windows NT 4.0 SP4 和更高版本,并且其实现通过使用 SO_EXCLUSIVEADDRUSE 选项。

WSAEFAULT (10014)

  • 翻译: 错误的地址。
  • 说明: 在尝试使用指针参数的调用时,系统检测到一个无效的指针地址。如果程序传递了无效的指针值,或者如果缓冲区的长度太小,则会发生此错误。例如,如果一个参数,它是一种 SOCKADDR 结构的长度小于 sizeof(SOCKADDR) 值,将发生此问题。

WSAEINVAL (10022)

  • 翻译: 无效的参数。
  • 说明setsockopt (Wsapiref_94aa.asp) 函数提供了无效的参数 (例如,指定了无效的级别参数)。有时,它也指从插座的当前状态,调用例如上没有侦听套接字, 接受 (Wsapiref_13aq.asp)。

WSAEMFILE (10024)

  • 翻译: 打开的文件太多。
  • 说明: 有太多打开的套接字。每个实现都可能具有套接字句柄可用的最大数目。这些句柄可能按进程、 全局或每个线程。

WSAEWOULDBLOCK (10035)

  • 翻译: 资源暂时不可用。
  • 说明: 将返回此错误无法立即完成,例如,非阻塞套接字操作中接收 (Wsapiref_2i9e.asp),当没有排队的数据要从套接字读取。它是一个非致命的错误,并可以以后再重试该操作。WSAEWOULDBLOCK 通常报告的调用结果连接 (Wsapiref_8m7m.asp) SOCK_STREAM 非阻塞套接字,因为一些时间必须经过建立的连接。

WSAEINPROGRESS (10036)

  • 翻译: 现在正在进行的操作。
  • 说明: 阻止操作当前正在运行。Windows 套接字只允许一个阻塞操作为每个任务或未完成的每个线程。如果 (无论是引用,或任何其他套接字) 进行任何其他函数调用,则操作将失败并出现 WSAEINPROGRESS 错误。

WSAEALREADY (10037)

  • 翻译: 操作已在进行。
  • 说明: 在非阻塞套接字上尝试执行操作,当操作已在进行中。例如,调用连接 (Wsapiref_8m7m.asp) 尝试第二次在非阻塞套接字已连接或已取消或已完成的异步请求 (WSAAsyncGetXbyY) 尝试。

WSAENOTSOCK (10038)

  • 翻译: 套接字操作在非插座进行插座上的。
  • 说明: 一项操作已尝试某件事并不是一个套接字。套接字句柄参数未引用有效的套接字,或者对于选择 (Wsapiref_1ab6.asp),fd_set 的成员是无效。

WSAEDESTADDRREQ (10039)

  • 翻译: 所需的目标地址。
  • 说明: 对套接字的操作中省略了必需的地址。例如,如果使用的远程地址的 ADDR_ANY 调用发送到 (Wsapiref_4sqa.asp),将返回此错误。

WSAEMSGSIZE (10040)

  • 翻译: 消息太长。
  • 说明: 在数据报套接字发送的消息大于内部消息缓冲器或其他一些网络限制,或用于接收数据报的缓冲区比数据报小。

WSAEPROTOTYPE (10041)

  • 翻译: 协议的套接字类型不正确。
  • 说明: 在套接字 (Wsapiref_2qr6.asp) 的函数调用中指定的协议不支持请求的套接字类型的语义。例如,ARPA 互联网 UDP 协议不能指定套接字类型为 SOCK_STREAM。

WSAENOPROTOOPT (10042)

  • 翻译: 错误的协议选项。
  • 说明: getsockopt (Wsapiref_8qcy.asp) 调用或 setsockopt (Wsapiref_94aa.asp) 调用中指定了未知、 无效或不受支持的选项或级别。

WSAEPROTONOSUPPORT (10043)

  • 翻译: 不支持的协议。
  • 说明: 请求的协议既没有配置系统中,或者它的实现不存在。例如,一个套接字 (Wsapiref_2qr6.asp) 调用请求的 SOCK_DGRAM 套接字,但指定的流协议。

WSAESOCKTNOSUPPORT (10044)

  • 翻译: 套接字类型不受支持。
  • 说明: 这个地址家族中不存在指定的套接字类型的支持。例如,可选中的套接字 (Wsapiref_2qr6.asp) 调用可能会选择类型,但实现不支持 SOCK_RAW SOCK_RAW 在所有套接字。

WSAEOPNOTSUPP (10045)

  • 翻译: 不支持此操作。
  • 说明: 所引用的对象的类型不支持所尝试的操作。当尝试接受在数据报套接字的连接到套接字不支持此操作的套接字说明符时,通常会发生此错误。

WSAEPFNOSUPPORT (10046)

  • 翻译: 协议系列不支持。
  • 说明: 它的实现不存在或尚未配置协议系列系统中。此消息具有从 WSAEAFNOSUPPORT 稍有不同的含义。但是,它是经常互换。返回以下消息之一的所有 Windows 套接字函数还可以都指定 WSAEAFNOSUPPORT。

WSAEAFNOSUPPORT (10047)

  • 翻译: 系列协议系列不支持地址。
  • 说明: 所使用的地址与请求的协议不兼容。所有套接字创建具有相关联的地址族 (即 AF_INET 的互联网协议) 和一般的协议类型 (即 SOCK_STREAM)。如果明确请求的套接字 (Wsapiref_2qr6.asp) 调用中的一个不正确的协议,或者错误系列中的一个地址用于套接字,例如,发送到 (Wsapiref_4sqa.asp) 中,将返回此错误。

WSAEADDRINUSE (10048)

  • 翻译: 地址已在使用中。
  • 说明: 通常,允许的每个套接字地址 (协议/IP 地址/端口) 只有一个使用情况。如果某个程序尝试绑定 (Wsapiref_6vzm.asp) IP 地址或端口已被使用的一个现有的插座未正确,关闭套接字的套接字,就会发生此错误,或仍在结束的过程是一个套接字。对于包含要将多个套接字绑定到同一端口号的服务器程序,请考虑使用 setsockopt (Wsapiref_94aa.asp)(SO_REUSEADDR)。客户端程序通常没有在所有调用绑定、 连接 (Wsapiref_8m7m.asp) 自动选择一个未使用的端口。当调用绑定时使用通配符地址 (涉及 ADDR_ANY) 时,提交特定地址之前,可能会延迟 WSAEADDRINUSE 错误。这可能会发生更高版本,其中包括连接、 侦听、 WSAConnect,或 WSAJoinLeaf 的另一个函数调用。

WSAEADDRNOTAVAIL (10049)

  • 翻译: 不能分配请求的地址。
  • 说明: 该请求的地址是在其上下文中的无效。导致此错误通常试图绑定 (Wsapiref_6vzm.asp) 到一个无效的本地计算机的地址。此错误可能还会从连接 (Wsapiref_8m7m.asp) sendto (Wsapiref_4sqa.asp) WSAConnect (Wsapiref_8kc2.asp)、 WSAJoinLeaf (Wsapiref_7dv6.asp) 或 WSASendTo (Wsapiref_752q.asp) 时远程地址或端口是无效的远程计算机 (for example,地址或端口 0)。

WSAENETDOWN (10050)

  • 翻译: 在网络出现故障。
  • 说明: 套接字操作遇到了死网络。此错误可能意味着网络系统 (即,对运行 Windows 套接字 DLL 协议堆栈)、 网络接口或本地网络本身的严重故障。

WSAENETUNREACH (10051)

  • 翻译: 连接不上网络。
  • 说明: 到无法访问的网络尝试执行套接字操作。此错误通常意味着本地软件知道没有访问远程主机的路由。

WSAENETRESET (10052)

  • 翻译: 网络中断连接重置。
  • 说明: 连接保持活动状态的活动,在操作过程中检测到故障原因被中断。它还可返回由 setsockopt (Wsapiref_94aa.asp) 如果尝试将 SO_KEEPALIVE 设置在连接已失败。

WSAECONNABORTED (10053)

  • 翻译: 软件造成连接终止。
  • 说明: 已建立的连接停止主机计算机中的软件可能因为数据传输超时或协议错。

WSAECONNRESET (10054)

  • 翻译: 连接被对等方重置。
  • 说明: 现有的连接被远程主机强行关闭。如果突然停止远程主机上的对等程序,重新启动主机时,或远程主机使用硬关闭,通常会发生此错误。有关远程的套接字上的 SO_LINGER 选项的详细信息,请参阅 setsockopt (Wsapiref_94aa.asp)。如果由于保持加电检测到故障,而一个或多个操作正在进行中的活动中,连接被中断,也可能导致此错误。使用 WSAENETRESET 时,正在进行的操作会失败。随后的操作失败,出现 WSAECONNRESET。

WSAENOBUFS (10055)

  • 翻译: 没有可用的缓冲区空间。
  • 说明: 由于系统缓冲区空间不足,或者因为队列已满,不能执行套接字操作。

WSAEISCONN (10056)

  • 翻译: 套接字已连接。
  • 说明: 在已连接的套接字上发出连接请求。如果发送到 (Wsapiref_4sqa.asp) 上调用连接的 SOCK_DGRAM 套接字 (对于 SOCK_STREAM 套接字,sendto (Wsapiref_4sqa.asp) 中的收件人参数将被忽略) 虽然其他实现将此视为有效的匹配项,某些实现还会返回该错误。

WSAENOTCONN (10057)

  • 翻译: 套接字未连接。
  • 说明: 由于套接字没有连接并且 (在使用 sendto [Wsapiref_4sqa.asp] 的数据文报套接字上发送时,未提供地址),不允许发送或接收数据的请求。任何其他类型的操作也可能会返回此错误,例如,如果连接已被重置设置 SO_KEEPALIVE setsockopt (Wsapiref_94aa.asp)。

WSAESHUTDOWN (10058)

  • 翻译: 套接字关闭后无法发送。
  • 说明: 发送或接收数据的请求不允许的因为套接字有已关闭在该方向与以前的关闭 (Wsapiref_60z6.asp) 调用。当调用一次关闭时,将请求关闭套接字的部分。这是一个信号,它已停止使用的发送或接收进程 (或两者)。

WSAETIMEDOUT (10060)

  • 翻译: 连接已超时。
  • 说明: 因为被连接的方没有正确响应后一段时间,或已建立的连接失败,因为被连接的主机未能响应而导致连接尝试失败。

WSAECONNREFUSED (10061)

  • 翻译: 连接被拒绝。
  • 说明: 可以创建任何连接,因为目标计算机主动拒绝。此错误通常是因试图连接到的服务,在外部主机上,就是一种没有运行的服务器程序处于非活动状态。

WSAEHOSTDOWN (10064)

  • 翻译: 主机已关闭。
  • 说明: 套接字操作失败,因为目标主机已关闭。套接字操作遇到死的主机。尚未启动的本地主机上的网络活动。这些条件都更有可能由错误 WSAETIMEDOUT。

WSAEHOSTUNREACH (10065)

  • 翻译: 没有到主机的路由。
  • 说明: 套接字操作已尝试到无法访问的主机。请参阅 WSAENETUNREACH。

WSAEPROCLIM (10067)

  • 翻译: 进程太多。
  • 描述: Windows 套接字实现可以在同一时间使用的程序的数目有限制。如果达到限制,WSAStartup (Wsapiref_1v8y.asp) 可能会失败并生成此错误。

WSASYSNOTREADY (10091)

  • 翻译: 网络子系统不可用。
  • 说明: 如果 Windows 套接字实现当前不能正常工作,因为它用来提供网络服务的基础系统当前不可用,WSAStartup (Wsapiref_1v8y.asp) 将返回此错误。确认下列信息:
    • 确认适当的 Windows 套接字 DLL 文件的当前路径。
    • 确认他们没有试图在同一时间使用多个 Windows 套接字实现。
    • 如果有多个 Winsock DLL 在系统上,确认适用于网络子系统当前加载第一个 Winsock DLL 的路径中。
    • 请确认所有必需的组件当前已安装并正确配置根据 Windows 套接字实现文档。

WSAVERNOTSUPPORTED (10092)

  • 翻译: 超出范围的 Winsock.dll 版本。
  • 说明: 当前的 Windows 套接字实现不支持该程序请求的 Windows 套接字规范版本。请确保正在访问任何旧的 Windows 套接字 DLL 文件。

WSANOTINITIALISED (10093)

  • 翻译: 还没有执行成功的 WSAStartup。
  • 说明: 两个程序中都有不调用 WSAStartup (Wsapiref_1v8y.asp) 或 WSAStartup (Wsapiref_1v8y.asp) 失败。该程序可能正在访问的插座,并不属于当前活动任务 (即,正在尝试进行共享的任务之间的套接字),或 WSACleanup 已被调用的次数太多。

WSAEDISCON (10101)

  • 翻译: 正在进行的正常关机。
  • 说明: 通过 WSARecv (Wsapiref_4z1u.asp) 和 WSARecvFrom (Wsapiref_4wky.asp) 来指示远程方已开始正常关机序列将返回此错误。

WSATYPE_NOT_FOUND (10109)

  • 翻译: 类找不到类型。
  • 说明: 未找到指定的类。

WSAHOST_NOT_FOUND (11001)

  • 翻译: 找不到主机。没有此主机不存在。
  • 说明: 该名称不是正式的主机名或别名,或找不到它的数据库中,将会被询问。此错误可能也会返回的协议和服务的查询,并在相关数据库中找不到指定的名称的方法。

WSATRY_AGAIN (11002)

  • 翻译: 没有发现非权威主机。
  • 说明: 此错误通常是临时错误在主机名称解析,过程中,这意味着本地服务器没有收到响应来自授权服务器。稍后进行的重试可能会成功。

WSANO_RECOVERY (11003)

  • 翻译: 这是一个不可恢复的错误。
  • 说明: 此错误表明在数据库查找中出现某种形式的不可恢复的错误。如果找不到数据库文件 (例如,BSD 兼容主机、 服务或协议文件) 或 DNS 请求返回的一个严重错误的服务器,则可能会发生此错误。

WSANO_DATA (11004)

  • 翻译: 有效的名称、 请求的类型的任何数据记录。
  • 说明: 请求的名称有效并且已找到在数据库中,但它不具有正确的关联的数据,它正在解析的。这样的典型示例尝试就是一个主机名称到地址转换 (使用 gethostbyname [Wsapiref_0q5u.asp] 或 [Wsapiref_7bhu.asp] WSAAsyncGetHostByName) 使用的 DNS 服务器。但没有一个记录,则返回的 MX 记录。这指示主机本身存在,但不可直接访问。

WSA_INVALID_HANDLE (操作系统相关)

  • 翻译: 指定事件对象的句柄无效。
  • 说明: 某个程序尝试使用一个事件对象,但指定的句柄无效。

WSA_INVALID_PARAMETER (操作系统相关)

  • 翻译: 一个或多个参数不正确。
  • 说明: 使用一个 Windows 套接字函数,直接将映射到 Win32 函数的程序。Win32 函数表示一个或多个参数有问题。

WSA_IO_INCOMPLETE (操作系统相关)

  • 翻译: 重叠的 I/O 事件对象会在终止状态。
  • 说明: 该程序已尝试确定尚未完成的重叠操作的状态。在轮询模式中使用 WSAGetOverlappedResult (使用 fWait 标志设置为 FALSE) 来确定时,重叠的操作已完成的程序在操作完成之前收到此错误代码。

WSA_IO_PENDING (操作系统相关)

  • 翻译: 重叠的操作将在稍后完成。
  • 说明: 该程序已启动无法立即完成一个重叠的操作。操作完成后,以备稍后发送完成指示。

WSA_NOT_ENOUGH_MEMORY (操作系统相关)

  • 翻译: 没有足够的内存。
  • 说明: 使用一个 Windows 套接字函数,直接将映射到 Win32 函数的程序。Win32 函数表示所需的内存资源不足。

WSA_OPERATION_ABORTED (操作系统相关)

  • 翻译: 重叠的操作已中止。
  • 说明: 由于套接字已关闭或 WSAIoctl (Wsapiref_6ik2.asp) 中的 SIO_FLUSH 命令运行重叠的操作被取消。

WSAINVALIDPROCTABLE (操作系统相关)

  • 翻译: 无效的过程表从服务提供商联系。
  • 说明: 一个服务提供程序返回一个无效的过程表到 Ws2_32.dll。(通常原因是一个或多个函数指针是空的。)

WSAINVALIDPROVIDER (操作系统相关)

  • 翻译: 无效的服务提供程序的版本号。
  • 说明: 一个服务提供程序返回不 2.0 版本编号。

WSAPROVIDERFAILEDINIT (操作系统相关)

  • 翻译: 无法初始化服务提供商。
  • 说明: 两个服务提供程序的 DLL 不能加载 (LoadLibrary 失败),或提供程序的 WSPStartup/NSPStartup 函数失败。

WSASYSCALLFAILURE (操作系统相关)

  • 翻译: 系统调用失败。
  • 说明: 永远不会发生故障的系统调用失败时,将返回此错误。例如,如果对 WaitForMultipleObjects 的调用失败或某一注册表函数失败时尝试更改协议或名称空间目录,就会发生此错误。


参见:http://support.microsoft.com/kb/819124/zh-cn

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WINDOWS环境 Windows几乎不需要介绍。然而人们很容易忘记Windows给办公室和家庭桌上型计算机所带来的重大改变。Windows在其早期曾经走过一段坎坷的道路,征服桌上型计算机市场的前途一度相当渺茫。 Windows简史 在1981年秋天IBM PC推出之后不久,MS-DOS就已经很明显成为PC上的主流操作系统。MS-DOS代表Microsoft Disk Operating System(磁盘操作系统)。MS-DOS是一个小型的操作系统。MS-DOS提供给用户一种命令列接口,提供如DIR和TYPE的命令,也可以将应用程序加载内存执行。对于应用程序写作者,它提供了一组函数呼叫,进行文件的输入输出(I/O )。对于其它的外围处理-尤其是将文字或图形写到显示器上-应用程序可以直接存取PC的硬件。 由于内存和硬件的限制,成熟的图形环境缓慢地才到来。当苹果计算机公司不幸的Lisa计算机在1983年1月发表时,它提供了不同于文字模式环境的另一种选择,并在1984年1月成为Macintosh上图形环境的一种标准。尽管Macintosh的市场占有率在下降,但是它仍然被认为是衡量所有其它图形环境的标准。包括Macintosh和Windows的所有图形环境,其实都要归功于Xerox Palo Alto Research Center(PARC)在70年代中期所作的开拓性研究工作。 Windows是由微软在1983年11月(在Lisa之后,Macintosh之前)宣布,并在两年后(1985年11月)发行。在此后的两年中,紧随着Microsoft Windows早期版本1.0之后,又推出了几种改进版本,以支持国际商业市场,并提供新型视讯显示器和打印机的驱动程序。 Windows版本2.0是在1987年11月正式在市场上推出的。该版本对使用者接口做了一些改进。这些改进中最有效的是使用了可重迭式窗口,而Windows 1.0中使用的是并排式窗口。Windows 2.0还增强了键盘和鼠标接口,特别是加入了菜单和对话框。 至此,Windows还只要求Intel 8086或者8088等级的微处理器,以「实际模式」执行,只能存取地址在1MB以下的内存。Windows/386(在Windows 2.0之后不久发行的)使用Intel 386微处理器的「虚拟8086」模式,实现将直接存取硬件的多个MS-DOS程序窗口化和多任务化。为了统一起见,Windows版本2.1被更名为Windows/286。 Windows 3.0是在1990年5月22日发表的。它将Windows/286和Windows/386结合到同一种产品中。Windows 3.0有了一个很大的改变,这就是对Intel的286、386和486微处理器保护模式的支持。这能使WindowsWindows应用程序能存取高达16MB的内存。Windows用于执行程序和维护文件的「外壳」程序得到了全面的改进。Windows 3.0是第一个在家用和办公室市场上取得立足点的版本。 任何Windows的历史介绍都必须包括一些OS/2的说明,OS/2是对DOS和Windows的另一种选择,最初是由Microsoft和IBM合作开发的。OS/2版本1.0(只有文字模式)在Intel 286(或者后来的)微处理器上运行,在1987年末发布。在1988年10月的OS/2版本1.1中出现了管理图形使用者接口的PM(Presentation Manager)。PM最初的设计构想是成为Windows的一种保护模式版本,但是图形API改变程度太大,致使软件生产厂商很难提供对这两种平台的支持。 到1990年9月,IBM和Microsoft之间的冲突达到了高峰,导致这两个公司最后分道扬镳。IBM接管了OS/2,而Microsoft明确表示Windows将是他们操作系统策略的中心。虽然OS/2仍然拥有一些狂热的崇拜者,但是它远不及Windows这样的普及程度。 Microsoft Windows版本3.1是1992年4月发布的,其中包括的几个重要特性是TrueType字体技术(给Windows带来可缩放的轮廓字体)、多媒体(声音和音乐)、对象连结和嵌入(OLE:Object Linking and Embedding)和通用对话框。跟OS/2一样,Windows 3.1只能在保护模式下运作,并且要求至少配置了1MB内存的286或386处理器。 在1993年7月发表的Windows NT是第一个支持Intel 386、486和Pentium微处理器32位保护模式的Windows版本。Windows NT提供32位平坦寻址,并使用32位的指令集。(本章后面我会谈到一些寻址空间的问题)。Windows NT还可以移植到非Intel处理器上,并在几种使用RISC芯片的工作站上执行。 Windows 95是在1995年8月发布的。和Windows NT一样,Windows 95也支持Intel 386或更高等级处理器的32位保护模式。虽然它缺少Windows NT中的某些功能,诸如高安全性和对RISC机器的可移植性等,但是Windows 95具有需要较少硬件资源的优点。 Windows 98在1998年6月发布,具有许多加强功能,包括执行效能的提高、更好的硬件支持以及与因特网和全球信息网(WWW)更紧密的结合。 Windows方面 Windows 98和Windows NT都是支持32位优先权式多任务(preemptive multitasking)及多线程的图形操作系统。Windows拥有图形使用者接口(GUI ),这种使用者界面也称作「可视化接口」或「图形窗口环境」。有关GUI的概念可追溯至70年代中期,在Alto和Star等机器上以及SmallTalk等环境中由Xerox PARC所作的研究工作。该项研究的成果后来被Apple Computer和Microsoft引入主流并流行起来。虽然有一些争议,但现在已非常清楚,GUI是(Microsoft的Charles Simonyi的说法)一个在个人计算机工业史上集各方面技术大成于一体的最重要产物。 所有GUI都在点矩阵对应的视讯显示器上处理图形。图形提供了使用屏幕的最佳方式、传递信息的可视化丰富多彩环境,以及能够WYSIWYG(what you see is what you get:所见即所得)的图形视讯显示和为书面文件准备好格式化文字输出内容。 在早期,视讯显示器仅用于响应使用者通过键盘输入的文字。在图形使用者接口中,视讯显示器自身成为使用者输入的一个来源。视讯显示器以图标和输入设备(例如按钮和滚动条)的形式显示多种图形对象。使用者可以使用键盘(或者更直接地使用鼠标等指向设备)直接在屏幕上操纵这些对象,拖动图形对象、按下鼠标按钮以及滚动滚动条。 因此,使用者与程序的交流变得更为亲密。这不再是一种从键盘到程序,再到视讯显示器的单向信息流动,使用者已经能够与显示器上的对象直接交互作用了。 使用者不再需要花费长时间学习如何使用计算机或掌握新程序了。Windows让这一切成真,因为所有应用程序都有相同的基本外观和感觉。程序占据一个窗口-屏幕上的一块矩形区域。每个窗口由一个标题列标识。大多数程序功能由程序的菜单开始。用户可使用滚动条观察那些无法在一个屏幕中装下的信息。某些菜单项目触发对话框,用户可在其中输入额外的信息。几乎在每个大的Windows程序中都有一个用于开启文件的特殊对话框。该对话框在所有这些Windows程序中看起来都一样(或接近相同),而且几乎总是从同一菜单选项中启动。 一旦您了解使用一个Windows程序的方法,您就非常容易学习其它的Windows程序。菜单和对话框允许用户试验一个新程序并探究它的功能。大多数Windows程序同时具有键盘接口和鼠标接口。虽然Windows程序的大多数功能可通过键盘控制,但使用鼠标要容易得多。 从程序写作者的角度看,一致的使用者接口来自于Windows建构菜单和对话框的内置程序。所有菜单都有同样的键盘和鼠标接口,因为这项工作是由Windows处理,而不是由应用程序处理。 为便于多个程序的使用,以及这些程序间信息的交换,Windows支持多任务。在同一时刻能有多个Windows程序显示并运行。每个程序在屏幕上占据一个窗口。用户可在屏幕上移动窗口,改变它们的大小,在不同程序间切换,并从一个程序向另一个程序传送数据。因为这些窗口看起来有些像桌面上的纸(当然,这是计算机还未占据办公桌之前的年代),Windows有时被称作:一个显示多个程序的「具象化桌面」。 Windows的早期版本使用一种「非优先权式(non-preemptive)」的多任务系统。这意味着Windows不使用系统定时器将处理时间分配给系统中运行的多个应用程序,程序必须自愿放弃控制以便其它程序运行。在Windows NT和Windows 98中,多任务是优先权式的,而且程序自身可分割成近乎同时执行的多个执行绪。 操作系统不对内存进行管理便无法实现多任务。当新程序启动、旧程序终止时,内存会出现碎裂空间。系统必须能够将闲置的内存空间组织在一起,因此系统必须能够移动内存中的程序代码和数据块。 即使是在8088微处理器上跑的Windows 1.0也能进行这类内存管理。在实际模式限制下,这种能力被认为是软件工程一个令人惊讶的成就。在Windows 1.0中,PC硬件结构的640KB内存限制,在不要求任何额外内存的情况下被有效地扩展了。但Microsoft并未就此停步:Windows 2.0允许Windows应用程序存取扩充内存(EMS);Windows 3.0在保护模式下,允许Windows应用程序存取高达16MB的扩展内存。Windows NT和Windows 98通过成熟的32位操作系统及平坦寻址空间,摆脱了这些旧的限制。 Windows上执行的程序可共享在称为「动态链接库」的文件中的例程。Windows包括一个机制,能够在执行时连结使用动态链接库中例程的程序。Windows自身基本上就是一个动态链接库的集合。 Windows是一个图形接口,Windows程序能够在视讯显示器和打印机上充分利用图形和格式化文字。图形接口不仅在外观上更有吸引力,而且还能够让使用者传递高层次的信息。 Windows应用程序不能直接存取屏幕和打印机等图形显示设备硬件。相反,Windows提供一种图形程序语言(称作图形设备接口,或者GDI),使显示图形和格式化文字更容易。Windows虚拟化了显示硬件,使为Windows编写的程序可使用任何具有Windows设备驱动程序的视频卡或打印机,而程序无需确定系统相连的设备类型。 对Windows开发者来说,将与设备无关的图形接口输出到IBM PC上不是件轻松的事。PC的设计是基于开放式架构的原则,鼓励第三方硬件制造商为PC开发接口设备,而且开发了大量这样的设备。虽然出现了多种标准,PC上的传统MS-DOS程序仍不得不各自支持许多不同的硬设备。这对MS-DOS字处理软件来说非常普遍,它们连同1到2张有许多小文件的磁盘一同销售,每个文件支持一种特定的打印机。Windows程序不要求每个应用程序都自行开发这些驱动程序,因为这种支持是Windows的一部分。 动态链接 Windows运作机制的核心是一个称作「动态链接」的概念。Windows提供了应用程序丰富的可呼叫函数,大多数用于实作其使用者接口和在视讯显示器上显示文字和图形。这些函数采用动态链接库(Dynamic Linking Library,DLL)的方式撰写。这些动态链接库是些具有.DLL或者有时是.EXE扩展名的文件,在Windows 98中通常位于\WINDOWS\SYSTEM子目录中,在Windows NT中通常位于\WINNT\SYSTEM和\WINNT\SYSTEM32子目录中。 在早期,Windows的主要部分仅通过三个动态链接库实作。这代表了Windows的三个主要子系统,它们被称作Kernel、User和GDI。当子系统的数目在Windows最近版本中增多时,大多数典型的Windows程序产生的函数呼叫仍对应到这三个模块之一。Kernel(日前由16位的KRNL386.EXE和32位的KERNEL32.DLL实现)处理所有在传统上由操作系统核心处理的事务-内存管理、文件I/O和多任务管理。User(由16位的USER.EXE和32位的USER32.DLL实作)指使用者接口,实作所有窗口运作机制。GDI(由16位的GDI.EXE和32位的GDI32.DLL实作)是一个图形设备接口,允许程序在屏幕和打印机上显示文字和图形。 Windows 98支持应用程序可使用的上千种函数呼叫。每个函数都有一个描述名称,例如CreateWindow。该函数(如您所猜想的)为程序建立新窗口。所有应用程序可以使用的Windows函数都在表头文件里预先声明过。 在Windows程序中,使用Windows函数的方式通常与使用如strlen等C语言链接库函数的方式相同。主要的区别在于C语言链接库函数的机械码连结到您的程序代码中,而Windows函数的程序代码在您程序执行文件外的DLL中。 当您执行Windows程序时,它通过一个称作「动态链接」的过程与Windows相接。一个Windows的.EXE文件中有使用到的不同动态链接库的参考数据,所使用的函数即在那些动态链接库中。当Windows程序被加载到内存中时,程序中的呼叫被指向DLL函数的入口。如果该DLL不在内存中,就把它加载到内存中。 当您连结Windows程序以产生一个可执行文件时,您必须连结程序开发环境提供的特定「引用链接库(import library)」。这些引用链接库包含了动态链接库名称和所有Windows函数呼叫的引用信息。连结程序使用该信息在.EXE文件中建立一个表格,在加载程序时,Windows使用它将呼叫转换为Windows函数。 WINDOWS程序设计选项 为说明Windows程序设计的多种技术,本书提供了许多范例程序。这些程序使用C语言撰写并原原本本的使用Windows API来开发程序。我将这种方法称作「古典」Windows程序设计。这是我们在1985年为Windows 1.0写程序的方法,它今天仍是写作Windows程序的有效方法。 API和内存模式 对于程序写作者来说,操作系统是由本身的API定义的。API包含了所有应用程序能够使用的操作系统函数呼叫,同时包含了相关的数据型态和结构。在Windows中,API还意味着一个特殊的程序架构,我们将在每章的开头进行研究。 一般而言,Windows API自Windows 1.0以来一直保持一致,没什么重大改变。具有Windows 98程序写作经验的Windows程序写作者会对Windows 1.0程序的原始码感觉非常熟悉。API改变的一种方式是进行增强。Windows 1.0支持不到450个函数呼叫,现在已有了上千种函数呼叫。 Windows API和它的语法的最大变化来自于从16位架构向32位架构转化的过程中。Windows从版本1.0到版本3.1使用16位Intel 8086、8088、和286微处理器上所谓的分段内存模式,由于兼容性的原因,从386开始的32位Intel微处理器也支持该模式。在这种模式下,微处理器缓存器的大小为16位,因此C的int数据型态也是16位宽。在分段内存模式下,内存地址由两个部分组成-一个16位段(segment)指针和一个16位偏移量(offset)指标。从程序写作者的角度看,这非常凌乱并带来了long或far指针(包括段地址和偏移量地址)和short或near指标(包括带有假定段地址的偏移量地址)的区别。 从Windows NT和Windows 95开始,Windows支持使用Intel 386、486和Pentium处理器32位模式下的32位平坦寻址内存模式。C语言的int数据型态也扩展为32位的值。为32位版本Windows编写的程序使用简单的平坦线性空间寻址的32位指针值。 用于16位版本Windows的API(Windows 1.0到Windows 3.1)现在称作Win16。用于32位版本Windows的API(Windows 95、Windows 98和所有版本的Windows NT)现在称作Win32。许多函数呼叫在从Win16到Win32的转变中保持相同,但有些需要增强。例如,图像坐标点由Win16中的16位值变为Win32中的32位值。此外,某些Win16函数呼叫返回一个包含在32位整数值中的二维坐标点。这在Win32中不可能,因此增加的新函数呼叫以不同方式运作。 所有32位版本的Windows都支持Win16 API(以确保和旧有应用程序兼容)和Win32 API(以运行新应用程序)。非常有趣的是,Windows NT与Windows 95及Windows 98的工作方式不同。在Windows NT中,Win16函数呼叫通过一个转换层被转化为Win32函数呼叫,然后被操作系统处理。在Windows 95和Windows 98中,该操作正相反:Win32函数呼叫通过转换层转换为Win16函数呼叫,再由操作系统处理。 在同一时刻有两个不同的Windows API集(至少名称不同)。Win32s (「s」代表「subset(子集)」)是一个API,允许程序写作者编写在Windows 3.1上执行的32位应用程序。该API仅支持已被Win16支持的32位函数版本。此外,Windows 95 API一度被称作Win32c(「c」代表「compatibility(兼容性)」),但该术语已被抛弃了。 现在,Windows NT和Windows 98都被认为能够支持Win32 API。然而,每个操作系统依然都支持某些不被别的操作系统支持的某些功能特性。因为它们的相同之处是相当可观的,所以有可能编写在两个操作系统下都可执行的程序。而且,人们普遍认为这两个产品最终会合而为一。 语言选项 使用C语言和原始的API不是编写Windows 98程序的唯一方法。然而,这种方法却提供给您最佳的性能、最强大的功能和在发掘Windows特性方面最大的灵活性。可执行文件相对较小且运行时不要求外部链接库(自然,Windows DLL自身除外)。最重要的是,不管您最终以什么方式开发Windows应用程序,熟悉API会使您对Windows内部有更深入的了解。 虽然我认为学习古典的Windows程序设计对任何Windows程序写作者都是重要的,我没有必要建议使用C和API编写每个Windows应用程序。许多程序写作者,特别是那些为公司内部开发程序或在家编写娱乐程序的程序写作者喜欢轻松的开发环境,例如Microsoft Visual Basic或者Borland Delphi(它结合了对象导向的Pascal版本)。这些环境使程序写作者将精力集中于应用程序的使用者接口和相关使用者接口对象的程序代码上。要学习Visual Basic,您也许需要参考Microsoft Press的一些其它图书,例如Michael Halvorson1996年着的《Learn Visual Basic Now》。 在专业程序写作者中-特别是那些开发商业应用程序的程序写作者-Microsoft Visual C++和Microsoft Foundation Class Library(MFC)是近年来流行的选择。MFC在一组C++对象类别中封装了许多Windows程序设计中的琐碎细节。Jeff Prosise的《Programming Windows with MFC,第二版》(Microsoft Press,1999年)提供了MFC程序的写作指南。 最近,Internet和World Wide Web的流行大力推广着Sun Microsystems的Java,这是一个受C++启发却与微处理器无关的程序设计语言,而且结合了可在几个操作系统平台上执行的图形应用程序开发工具组。Microsoft Press有一本关于Microsoft J++(Microsoft的Java)开发工具的好书,《Programming Visual J++ 6.0》(1998年),由Stephen R. Davis着。 显然,很难说哪种方法更有利于开发Windows应用程序。更主要的是,也许是应用程序自身的特性决定了所使用的工具。不管您最后实际上使用什么工具写作程序,学习Windows API将使您更深入地了解Windows工作的方式。Windows是一个复杂的系统,在API上增加一个程序写作层并未减少它的复杂性,仅仅是掩盖了它,早晚您会碰到它。了解API会给您更好的补救机会。 在原始的Windows API之上的任何软件层都必定将您限制在全部功能的一个子集内。您也许发现,例如,使用Visual Basic编写应用程序非常理想,然而它不允许您做一个或两个很简单的基本工作。在这种情况下,您将不得不使用原始的API呼叫。API定义了作为Windows程序写作者所需的一切。没有什么方法比直接使用API更万能的了。 MFC尤其问题百出。虽然它大幅简化了某些工作(例如OLE),我却经常发现要让它们按我所想的去工作时,会在其它特性(例如Document/View架构)上碰壁。MFC还不是Windows程序设计者所追求的灵丹妙药,很少有人认为它是一个好的对象导向设计的模型。MFC程序写作者从他们使用的对象类别定义如何工作中受益颇深,并会发现他们经常参考MFC原始码,搞懂这些原始码是学习Windows API的好处之一。 程序开发环境 在本书中,假定您正使用Microsoft Visual C++ 6.0,标准版、专业版和企业版都可以。经济的标准版足以应付本书中的程序设计需求。Visual C++ 还是Visual Studio 6.0中的一部分。 Microsoft Visual C++ 软件包中包括C编译器和其它编译及连结Windows程序所需的文件和工具等。它还包括Visual C++ Developer Studio,一个可编辑原始码、以交谈方式建立资源(如图标和对话框)以及编辑、编译、执行和测试程序的环境。 如果您正使用Visual C++ 5.0,则需要为Windows 98和Windows NT 5.0更新表头文件和引用链接库,这些东西可从Microsoft的网站上得到。在 http://www.microsoft.com/msdn/,选择「Downloads」,然后选择「 Platform SDK」(软件开发套件),您就能在选择的目录中下载和安装更新文件。要让Microsoft Developer Studio浏览这些目录,可以从「Tool」菜单项选择「 Options」然后按下「Directories」标签。 Microsoft网站上的msdn部分代表「Microsoft Developer Network(Microsoft软件开发者网络)」。这是一个向程序写作者提供了经常更新的CD-ROM的计划,这些CD-ROM中包含了程序写作者在Windows开发中所需的最新东西。您也可以订阅MSDN,这样就避免经常得从Microsoft的网站下载文件。 API文件 本书不是Windows API权威的正式文件的替代品。那组文件不再以印刷形式出版,它仅能从CD-ROM或Internet上取得。 当您安装Visual C++ 6.0时,您将得到一个包括API文件的在线求助系统。您可通过订阅MSDN或使用Microsoft网站上的在线求助系统更新该文件。连接到 http://www.microsoft.com/msdn/,并选择「MSDN Library Online」。 在Visual C++ 6.0中,从「Help」菜单项选择「Contents」项目开启MSDN窗口。API文件按树形结构组织,寻找标有「 Platform SDK」的部分,所有在本书中引用的文件都来自于该部分。我将向您介绍如何从「 Platform SDK」开始寻找以斜线分层分门别类的文件的位置。(我知道「Platform SDK」是整个MSDN知识库中较为晦涩的部分,但我敢保证那是Windows程序设计的基本核心。)例如,对于如何在Windows程序中使用鼠标的文件,您可参考/ Platform SDK / User Interface Services / User Input / Mouse Input。 我在前面提到Windows大致分为Kernel、User和GDI子系统。kernel接口在/ Platform SDK / Windows Base Services中,User界面函数在 / Platform SDK / User Interface Services中,GDI位于 / Platform SDK / Graphics and Multimedia Services / GDI中。 编写第一个WINDOWS程序 现在是开始写些程序的时候了。为了便于对比,让我们以一个非常短的Windows程序和一个简短的文字模式程序开始。这会帮助我们找到使用开发环境并感受建立和编译程序机制的正确方向。 文字模式(Character-Mode)模型 程序写作者们喜爱的一本书是《The C Programming Language》(Prentice Hall,1978年和1988年),由Brian W. Kernighan和Dennis M. Ritchie(亲切地称为K&R)编着。该书的第一章以一个显示「hello, world」的C语言程序开始。 这里是在《The C Programming Language》第一版第6页中出现的程序: main () { printf ("hello, world\n") ; } 以前C程序写作者在使用printf等C执行期链接库函数时,无需先声明它们。但这是90年代,我们愿意给编译器一个在我们的程序中标出错误的机会。这里是在K&R第二版中修正的程序: #include <stdio.h> main () { printf ("hello, world\n") ; } 该程序仍然是那么短。但它可通过编译并执行得很好,但当今许多程序写作者更愿意清楚地说明main函数的返回值,在这种情况下ANSI C规定该函数必须返回一个值: #include <stdio.h> int main () { printf ("hello, world\n") ; return 0 ; } 我们还可以包括main的参数,把程序弄得更长一些,但让我们暂且这样就好了-包括一个include声明、程序的进入点、一个对执行期链接库函数的呼叫和一个return语句。 同样效果的Windows程序 Windows关于「hello, world」程序的等价程序有和文字模式版本完全相同的组件。它有一个include声明、一个程序进入点、一个函数呼叫和一个return语句。下面便是该程序: /*------------------------------------------------------------------ HelloMsg.c -- Displays "Hello, Windows 98!" in a message box (c) Charles Petzold, 1998 --------------------------------------------------------------------*/ #include <windows.h> int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MessageBox (NULL, TEXT ("Hello, Windows 98!"), TEXT ("HelloMsg"), 0); return 0 ; } 在剖析该程序之前,让我们看一下在Visual C++ Developer Studio中建立新程序的方式。 首先,从File菜单中选New。在 New对话框中,单击Projects页面标签,选择 Win32 Application。在Location栏中,选择一个子目录,在 Project Name栏中,输入该项目的名称,此时该名称是HelloMsg,这便是在 Location栏中显示的目录的子目录。Create New Workspace复选框应该勾起来,Platforms部分应该显示 Win32,选择OK。 将会出现一个标题为Win32 Application - Step 1 Of 1的对话框,指出要建立一个Empty Project,并按下Finish按钮。 从File菜单中再次选择New。在 New对话框中,选择Files页面标签,选择 C++ Source File。Add To Project复选框应被选中,并应显示HelloMsg。在 File Name栏中输入HelloMsg.c,选中OK。 现在您可输入上面所示的HELLOMSG.C文件,您也可以选择Insert菜单和 File As Text选项从本书附带的CD-ROM上复制HELLOMSG.C的内容。 从结构上说,HELLOMSG.C与K&R的「hello,world」程序是相同的。表头文件STDIO.H已被WINDOWS.H所代替,进入点main被WinMain所代替,而且C语言执行时期链接库函数printf被Windows API函数MessageBox所代替。然而,在程序中有许多新东西,包括几个陌生的大写标识符。 让我们从头开始。 表头文件 HELLOMSG.C以一个前置处理器指示命令开始,实际上在每个用C编写的Windows程序的开头都可看到:
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明
Windows套接字是一种网络通信的基本构件,最初是由微软和第三方厂商共同制定的一套标准,即Windows Socket规范(WinSock)。它是用来实现网络通信的编程接口,可以在Windows操作系统上运行。套接字包含了两个信息,一个是IP地址,一个是端口号,通过这两个信息可以确定网络中的任何一个通讯节点。所有数据传输都是通过套接字来完成的。创建一个套接字后,可以通过绑定函数来将套接字与需要进行通信的地址建立联系。套接字类型可以是流式套接字(SOCK_STREAM)或数据报套接字(SOCK_DGRAM)。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Visual C++程序设计: Windows套接字技术 ](https://blog.csdn.net/sxlijie_2008/article/details/2157039)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Windows 网络通信套接字技术](https://blog.csdn.net/weixin_45525272/article/details/105327664)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值