Windows套接字:块

本文和准则手册在 Windows 套接字编程说明若干问题。 本文包含块。 在其他文章中的问题包括: Windows 套接字:字节顺序Windows 套接字:将字符串

如果从类 CAsyncSocket使用或派生,将需要管理这些问题。 如果从类 CSocket使用或派生, MFC 为您管理它们。

套接字可以在 “块模式”或 “非阻塞模式”。套接字的功能块 (或同步) 模式的不返回直到它们可以完成它们的事件。 这称为块,因为函数调用的套接字无法执行任何 —阻止 —直到调用返回。 为 接收 成员函数的调用,例如,可能需要随机很长时间才能完成,它在等待发送的应用程序发送 (这是,如果使用 CSocket,或者使用块的 CAsyncSocket )。 如果 CAsyncSocket 对象在直接非阻塞操作异步模式 (),调用返回和当前错误代码下,可检索与 获得最后一个错误 成员函数,是 WSAEWOULDBLOCK,指示调用将阻止使其不立即返回由于该模式。 (CSocket 从不返回 WSAEWOULDBLOCK。 类管理块您的。)

套接字行为不同。 32 位和 64 位操作系统下 (例如 Windows 95 或 Windows 98) 比在 16 位操作系统下 (例如 Windows 3.1)。 不同于 16 位操作系统, 32 位和 64 位操作系统上使用抢先多任务并提供多线程。 在 32 位和 64 位操作系统下,可以在单独的辅助线程可以将您的套接字。 在线程的一个套接字会阻塞,而不会干扰其他事件在应用程序和,而无需花费计算阻塞时间。 有关多线程编程的信息,请参见中的文章 多线程处理

备注

在多线程应用程序,则可以使用 CSocket 块的谓词简化您的编程,而不影响用户界面的响应能力。通过处理在处理在替换线程的主线程和 CSocket 的用户交互,可以分隔这些逻辑运算。在不支持的多线程应用程序,则必须合并和处理这两个事件为单个线程,在长同步事件过程中,通常意味着使用 CAsyncSocket ,因此可以处理通信请求按需或重写的 CSocket::OnMessagePending 以处理用户操作。

其余部分此讨论用于针对 16 位操作系统的程序员:

通常,因此,如果您使用 CAsyncSocket,应避免使用停滞操作和异步操作。 ,例如,在异步操作,从的点在调用 接收后接收 WSAEWOULDBLOCK 错误代码可以等待,直到您的 OnReceive 成员函数调用通知您可以重新读取。 异步调用通过调用您的套接字的相应回调来通知函数执行,如 OnReceive

在 windows 下,块调用视为错误约定。 默认情况下, CAsyncSocket 支持异步调用,使用回调来通知,因此,您必须管理块。 类 CSocket,另一方面,是同步的。 它发送 windows 消息和管理块您的。

有关阻塞的更多信息,请参见 Windows 套接字规范。 有关 " on " 功能的更多信息,请参见 Windows 套接字:存储通知Windows 套接字:从派生的存储类

有关更多信息,请参见:

请参见

参考

CAsyncSocket::OnSend

概念

在MFC的Windows套接字