初学的都是阻塞操作,调用一个函数如read recv 等,在函数完成,即在读到东西前,不可返回。
然而,对于复杂的通信,异步通信,异步交互,并没有一定的对话顺序。
比如A和B通信,并不总是A说一句 B再说另一句 A再回一句,完全可能是A连说三句,B再说四句,即没有一定的对话交互序列。
因此写程序时 就不能决定 send recv 的顺序。
如果程序固定是A说一句 B再说另一句 A再回一句,那么A的程序可以是 send recv send, B的程序是recv send recv。
然而,A B的对话是不确定的,完全可能是A连说三句,B再说四句, 写程序时 没办法固定一个 send recv 的顺序。如果A recv了,而B并没有send,则A等死了。
因此 需要 非阻塞模式。
非阻塞模式,调用recv时,如果对面没send,则不等待,立即返回。
非阻塞模式,可以在recv/read前边多加一个查询操作,查询是不是对面说话了,如果他说了,我再recv,再去处理,如果他没说话,我随时准备着自己去说。
查询用的函数可以是select poll 等。