Linux socket 读写接口返回值分析
首先说明:recv()/send(),recvfrom()/sendto(),recvmst()/sendmsg()最终系统入口是sock_sendmsg()/sock_recvmsg()。他们的返回值是统一的。对于sock_sendmsg()/sock_recvmsg(),不同的family具备各自的实现总结如下:对于读返回值的优先级: return copied?:err;
首先说明: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(本端关闭了套接字)
更多推荐
所有评论(0)