首先说明:recv()/send(),recvfrom()/sendto(),recvmst()/sendmsg()最终系统入口是sock_sendmsg()/sock_recvmsg()。他们的返回值是统一的。

对于sock_sendmsg()/sock_recvmsg(),不同的family具备各自的实现总结如下:

对于读

返回值的优先级: 

return copied?:err;  

如果读/写的字节数copied>0,则必返回copied。否则(copied==0)返回err,其中,如果err!=0,表示遇到了错误。否则err=0,对端关闭了套接字

读:

     阻塞                                <0                                                                                                0                                                                    0<&<n

                      EINT(阻塞过程被唤起&&非超时&&copied==0)            copied==0, 对端socket关闭 (FIN,即EOF)             copied>0 , errno中可以找到<n的原因

                      EAGAIN(阻塞过程被唤起&&超时了&&copied==0)

    非阻塞          

                     EAGAIN(阻塞过程被唤起&&超时了&&copied==0)      copied==0, 对端socket关闭 (FIN,即EOF)               copied>0 , errno中可以找到<n的原因


对于写

返回值的优先级: 

return sent?:err;  

写:

     阻塞                                <0                                                                                                0                                                                    0<&<n

                      EINT(阻塞过程被唤起&&非超时&&sent==0)                                              ?                                         sent>0 , errno中可以找到<n的原因

                      EAGAIN(阻塞过程被唤起&&超时了&&sent==0)

                     EPIPE(本端关闭了套接字)

    非阻塞          

                     EAGAIN(阻塞过程被唤起&&超时了&&sent==0)                                            ?                                           sent>0 , errno中可以找到<n的原因

                     EPIPE(本端关闭了套接字)


Logo

更多推荐