如果我采用WSAAsyncSelect这种IO模型,那么默认情况下套接字是非阻塞的、所有事件处理都是异步的也就是非阻塞的,那如果我在此基础上:
BOOL bNonBlock = FALSE;
ioctlsocket(s, FIONBIO, &bNonBlock);
这样以后,套接字就变成阻塞的了,我想问这样的操作会导致什么后果吗?本来的异步事件处理会不会因为阻塞的套接字而也相应变成同步事件处理了?PS.一直不太理解 一个套接字是阻塞或是非阻塞 对整个IO模型有什么影响?难道把套接字设置成阻塞的,那send的就自动变成阻塞了么?~而把套接字设置成非阻塞的,那send函数就变成非阻塞了??
BOOL bNonBlock = FALSE;
ioctlsocket(s, FIONBIO, &bNonBlock);
这样以后,套接字就变成阻塞的了,我想问这样的操作会导致什么后果吗?本来的异步事件处理会不会因为阻塞的套接字而也相应变成同步事件处理了?PS.一直不太理解 一个套接字是阻塞或是非阻塞 对整个IO模型有什么影响?难道把套接字设置成阻塞的,那send的就自动变成阻塞了么?~而把套接字设置成非阻塞的,那send函数就变成非阻塞了??
一个套接字是非阻塞的,那么它的send函数就是非阻塞的.
2 套接字模型与I/O模型的关系:
套接字模型是定义一个SOCKET的行为方式.阻塞的SOCKET, 它在执行SEND时,发送不成功,SEND函数不会返回,程序也就不能向下执行. 非阻塞send, 成功不成功都返回,根据返回值来判断是否成功.如果不成功,你还要继续的调用.
I/O模型是当你的程序中有多个SOCKET的话, 如何管理它们以让他们达到最高的工作效率.
比如说wsasyncselect模型, 把一个socket和一个windows procedure联系起来,把这个socket设成非阻塞的,它send了一个数据返回了,即使他不成功,你也不用再来调用了,当它可以发送时,OS会给windows procedure发消息的. 如何你把它改成阻塞的了,那么你就失去了使用I/O模型的意义了.