套接字API(十四)write和read
来源:互联网 发布:五毛钱特效app软件 编辑:程序博客网 时间:2024/05/16 02:22
一 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数据报。
- 套接字API(十四)write和read
- 对监听套接字进行read、write和connect操作会怎样?
- 对监听套接字进行read、write和connect操作会怎样?
- unix网络编程I卷之字节流套接字中的read和write问题
- socket api -- read write
- read和write函数
- read和write函数
- write和read
- write和read
- read和write
- mmap和read、write
- 套接字结构和API
- (十四) 套接字
- (十四) 套接字 - select
- read 函数和 write 函数
- read和write函数用法
- 封装read和write函数
- write()和read()
- linux下如何获取cpu的利用率
- Kendo UI开发教程: Kendo UI 示例及总结
- 关于四字节对齐的问题
- 关于本博客 http://www.imobilebbs.com
- 关于android微信分享的开发
- 套接字API(十四)write和read
- C++ 类的继承
- share a bibtex for all paper tex
- sed 命令
- 迭代和递归的区别之处
- Java中clone方法的使用
- 华为Java上机题 2012
- 代码的回溯分析
- HDU 4266 The Worm in the Apple(三维凸包内点到表面距离)