在windows平台下socket有阻塞型和非阻塞型的区分。
阻塞型socket的一个特点就是在某些socket api上调用时会阻塞,知道操作完成。比如send, recv,在这样的socket上比较容易开发,但阻塞导致的调用线程挂起也是很浪费时间的,效率不高。可以通过ioctlsocket将阻塞型socket设置为非阻塞型。如果在阻塞型socket上使用了wsaasyncselect,wsaeventselect,阻塞型socket会自动变成非阻塞型socket。
send时当对方收缓冲区满时会导致发送线程挂起。
recv时当本地收缓冲空时会阻塞导致线程鼓起,否则将数据copy到用户缓冲,数据小于等于用户指定的值。
非阻塞型socket和阻塞型socket在某些socket api调用上正好相反,它不会阻塞导致调用者线程挂起,这样效率高些,但开发上需要更多的代码处理。
send时当对方收缓冲区满时会立即返回-1。
recv时不管本地缓冲是否有数据立即返回,有数据时收到的数据小于等于用户指定的值。