有关socket Read
来源:互联网 发布:钉钉网络检测异常 编辑:程序博客网 时间:2024/05/03 03:54
- 实际开发中,网络程序最可能遇到的就是数据没收到、收到错误数据这样诡异的问题.
- 很多时候,都是由于对socket read的细节理解的不一致,导致了程序前后的矛盾。
- 下面详细阐述整个read的过程。
一、从c的角度
ssize_t read(int fd,void *buf,size_t nbyte)
- read函数是负责从fd中读取内容.
- 当读成功时, read返回实际所读的字节数
如果返回的值是0 表示已经读到文件的结束了,小于0表示出现了错误。
可以同时检查errno:
- 如果错误为EINTR(值为4)说明读是由中断引起的
- 如果是ECONNREST表示网络连接出了问题
二、从协议角度
- TCP协议是面向流的
- read和write调用的返回值往往小于参数指定的字节数。
- 对于read调用,如果接收缓冲区中有20字节,请求读100个字节,就会返回20。
- 对于write调用,如果请求写100个字节,而发送缓冲区中只有20个字节的空闲位置,那么write会阻塞,直到把100个字节全部交给发送缓冲区才返回,但如果socket文件描述符有O_NONBLOCK标志,则write不阻塞,直接返回20。
三、从java的角度
SocketChannel sc = (SocketChannel) sk.channel(); int i = sc.read(buff)
- SocketChannel.read 有数据时返回数据长度。
- 如果返回的值是0 表示已经读到文件的结束了,小于0表示出现了错误(继承自C)。
- 而linux的函数是针对文件fd出现的定义,如果是网络时,EOF的界限十分模糊。
四、从kernel的角度
static int unix_stream_recvmsg(struct kiocb iocb, struct socket sock,
struct msghdr *msg, size_t size, int flags)
- http://blog.chinaunix.net/uid-23629988-id-3035613.html
- 这篇文章的主人详细分析了整个过程。
- 当网卡上没有数据时,返回为0。
- 另外在对端单独close write或者自己单独close read时,也返回0。
- 当数据取完了,且出现意外的系统调用,比如网卡故障,返回-1。
五、从java nio的框架角度
- 结合java nio的selector机制,要对read为0的情况进行统计处理。
- 同一源过多的read为0,意味着网络不好,或者恶意攻击。
原创文章如转载,请注明:转载自五四陈科学院[http://www.54chen.com]
0 0
- 有关socket Read
- socket api -- read write
- linux socket read 阻塞
- linux socket read
- linux socket read函数
- socket中的read()
- linux socket read 阻塞
- linux socket read 阻塞
- socket read浅析
- socket inputstream read
- 有关socket确认连接
- socket通信之read阻塞
- socket编程之read/write
- android socket read阻塞问题
- android socket read阻塞问题
- Socket read阻塞 处理方法
- socket中的read返回0
- 有关[SQLServerJDBCDriver]ResultSetcannotre-read错误的解决方案
- 黑马程序员——java基础---IO流(第19天)
- C/C++快速读写磁盘数据的方法-块读取/异步/优化分析算法/内存文件映射的原理和使用
- 组合数与母函数
- GRE写作必备句型
- 欢迎使用CSDN-markdown编辑器
- 有关socket Read
- PS 图像调整— — gain and bias
- Android动画中属性fillafter和fillbefore的正确理解
- angular 第二章 双向数据绑定
- C++学习网站
- 打印android key的信息
- [Object-c] 通知 通告 简介
- Java栈与堆
- 拷贝构造函数