套接字API(十四)write和read

write和read:

(一)write:应用进程调用write,内核从该应用进程的缓冲区中复制所有数据到所写套接字的发送缓冲区。

(二)read:应用进程调用read,内核从套接字的接收缓冲区读取数据。

*read返回0:即EOF,例如:接受到FIN的一段,FIN由TCP确认,FIN的接收也作为一个EOF传递给应用进程。

*read返回-1:并设置errno变量。

*read返回小于n:读不足的数据。

*read返回n:读完请求的数据。


(三)如果套接字是阻塞的:默认情况,可通过fcntl修改。

1.write:

*如果套接字的发送缓冲区没有空间,则应用进程阻塞,直到有空间为止(TCP);由于UDP套接字不存在真正的发送缓冲区,内核只是复制应用进程数据并把它沿协议栈向下传送,因此对于一个UDP套接字不会因与TCP一样的原因将其阻塞。

*否则,write调用可以返回,可能会返回不足值,因为套接字的缓冲区可能已经达到极限,这时需使用readn(自己实现)或recv(设置MSG_WAITALL)。

2.read:

*如果套接字接收缓冲区为空则阻塞应用进程,直到有一些数据到达(TCP);对于UDP套接字,如果UDP套接字接受缓冲区为空,则阻塞进程,直到有UDP数据报到达。

*否则,read调用返回,可能返回的字节数比请求的少,这时需使用readn(自己实现)或recv(设置MSG_WAITALL)。


(四)如果套接字是非阻塞的:通过fcntl修改。

1.write:

*如果非阻塞的套接字的发送缓存没有空间,则函数立即返回EWOULDBLOCK(或EAGIN)错误;补充:对于其他非阻塞描述符返回EAGIN。

*如果其发送缓冲区中有一些空间,返回值是内核能够复制到该缓冲区中的字节数。

2.read:

*如果输入操作不能被满足(对于TCP套接字即至少有一个字节的数据可读,对于UDP数据报既有一个完整的UDP数据报可读),则函数立即返回EWOULDBLOCK(或EAGIN)错误。

*否则,read调用返回,可能返回的字节数比请求的少,这时需使用readn(自己实现)或recv(设置MSG_WAITALL);对于UDP则返回一个完整UDP数据报。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值