我们拿最常用的send和recv两个函数来说吧,比如:你调用send函数发送一定的Byte,在系统内部send做的工作其实只是把数据传输(Copy)到TCP/IP协议栈的输出缓冲区,它执行成功并不代表数据已经成功的发送出去了,如果TCP/IP协议栈没有足够的可用缓冲区来保存你Copy过来的数据的话,这时候就体现出阻塞和非阻塞的不同之处了:
对于阻塞模式的socket 来说send函数将不返回直到系统缓冲区有足够的空间把你要发送的数据Copy过去以后才返回,
对于非阻塞模式的socket来说send会立即返回WSAEWOULDDBLOCK告诉调用者说:"发送操作被阻塞了!!!仅仅是将数据拷贝到协议栈的缓存区而已,如果缓存区可用空间不够,则尽能力的拷贝,立即返回成功拷贝的大小;如缓存区可用空间为0,则返回-1,同时设置errno为EAGAIN.