线程,然后检查Windows Sockets功能是否完成。如果功能完成了,或者WSACancel BlockingCall()
被唤起,阻塞操作以一个适当的返回值结束。
如果一个正在运行某一阻塞操作的进程收到了一个Windows消息,那么应用程序有可能试图
发出另一个Windows Sockets调用,由于很难安全地处理这种情形,Windows Sockets规范不支持
这种应用程序的工作方式。在这种情况下,有两个函数可以帮助编程者。WSAIsBlocking()可以
中考心理辅导>一般将来时的结构用来确定在该进程上是否有阻塞的Windows Sockets调用。WSACancelBlookingCall()可以用来取
消在线的阻塞调用,如果有的话。任何其他的Windows Sockets函数如果在这种情况下被调用,
则会失败并返回错误代码WSAEINPROGRESS。要强调的是,这一限制适用于所有阻塞和非阻塞
model behavior的操作。
虽然这种机制对于简单的应用程序已经足够了,但这不能支持高级应用程序的复杂的消
互动英文
息发送要求。(例如,那些MDI模型的用户)对于这样的应用程序,Windows Sockets API设计了WSASetBlockingHook()函数,这个函数可以允许编程者定义特殊的阻塞钩子来代替上面讨论的缺
英语四级准考证号忘了怎么办省消息发送例程。
只有在以下都为真时,Windows Sockets DLL才调用阻塞钩子函数:例程是被定义为可以阻
塞的,指定的套接口也是阻塞套接口,而且请求不能被立刻完成(套接口是被缺省地设为阻塞方
式的,但IOCTL FIONBIO和WSAAsyncSelect()都可以把套接口设置成为非阻塞模式)。如果应
用程序只使用非阻塞方式的套接口,而且使用WSAAsyncSelect()和/或WSAAsync GetXByY()例程,而不是使用lect()和/或getXbyY()例程,那么阻塞钩子函数就永远也不会被调用,应用程
padam padam序也不用再操心由于阻塞钩子函数而带来的重入问题。
如果一个应用程序在唤起异步或非阻塞方式调用时使用了一个内存对象的指针(如一个缓冲区,或者一个全程变量)作为参数,那么应用程序要保证那个对象在Windows Sockets实现的整
个操作中都可得到并使用。应用程序不能再唤起可能影响到内存唤射或寻址能力的其他的Windows函
数。在多线程系统中,应用程序也有责任使用某种同步机制来协调对内存对象的存取。Windows Sockets实现不能,也不会提出这种事情。没有遵守这条规则,所可能产生的后果已不在
规范讨论的范围之内。
3.1.3WinSock规范与Berkeley套接口的区别
为了能在Windows环境中很好地实现,WinSock API对传统风格的Berkeley套接字规范做了
很有限的一些改变。
1.套接口数据类型和该类型的错误返回值
highlighting在UNIX操作系统中,包括套接口句柄在内的所有句柄,都是非负的短整数,在WinSock规
范中定义了一个新的数据类型,称作SOCKET,用来代表套接字描述符。
typedef u_int SOCKET;youtube
因为SOCKET类型实际是无符号的整数,所以SOCKET可以取从0到INV ALID_SOCKET-1
之间的任意值。socket()函数和accept()函数返回时,返回的就是SOCKET类型。要检查它们的
执行是否有错误发生,应用程序应该将返回值与预定义常量INV ALID_SOCKET来比较,该常量
已在WINSOCK.H中定义。而不应该再使用把返回值和−1比较的方法,或判断返回值是否为负,来判断这两个函数是否出错。这两种方法在BSD UNIX套接字规范中都是很普通、很合法的途径,但在WinSock规范中不行。所以编译已经存在于UNIX环境中的应用程序的源代码可能会导致出
trours71rakuten