由两个问题展开
1.阻塞模式下,socket的输入缓冲区没有可读取数据时,read操作会返回错误。答案是“正确”,可能的解释是返回-1。
2.在阻塞socket上调用write函数发送数据,函数返回时,表示数据已经发送出去。答案是“错误”,可能的解释是返回错误也叫返回。
两个对应的疑问:
问题1,对应的,找到类似这样一句话“阻塞模式下,send会卡住,不返回控制权,直到数据传到TCP层继续”,既然叫阻塞,阻塞什么?阻塞程序的运行了,也就是不返回。
既然阻塞不返回,无数据可以读取为什么还会返回错误,而不是卡住等待?
关于问题2,是,函数返回也可以返回错误,就不代表发送出去,但是前提也强调了,是阻塞socket,所以,这个write为什么就不会卡住?还有write和send什么区别?是分两步?write一步,send一步,那write确实不代表发送出去,是写到缓冲区。
表面看起来,问题的解释和已知的有些矛盾,这两个题都是阻塞,可是都能不等待发出/读入就返回控制权继续运行。
那么就要分清write、send和read的区别才能搞清楚到底哪种说法对,以及哪步该卡住哪步不该卡住了。
小知识:用linux当高性能服务器而不是windows的一个原因,说重叠IO比较适合高性能服务器,WINDOWS的IOCP需要事先分配缓存,比较吃内存,而linux就不会。目前这句话理解不深刻,什么是重叠IO和IOCP。