有关socket Read

转载 2015年07月07日 15:27:25
  • 实际开发中,网络程序最可能遇到的就是数据没收到、收到错误数据这样诡异的问题.
  • 很多时候,都是由于对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]

socket编程之read/write

一. read/write的语义:为什么会阻塞? 先从write说起: #include ssize_t write(int fd, const void *buf, size_t count);...
  • suifengpiao_2011
  • suifengpiao_2011
  • 2016年05月13日 15:57
  • 4682

linux socket read函数

int my_read(int fd, void *buffer, int length) { int bytes_left; in...
  • caianye
  • caianye
  • 2014年04月21日 14:35
  • 3951

unix/linux socket read函数的封装

int readcnta(int curSock,char * buff,int length){int ret;int i;int templen;int l_length;ret=0;l_leng...
  • wbj1234566
  • wbj1234566
  • 2008年05月27日 15:42
  • 3051

解决socket通信中的read阻塞

客户端public class SocketClient { public static void main(String[] args) throws Exception {  while(true...
  • wj1900
  • wj1900
  • 2010年02月05日 11:45
  • 6523

oracle 连不上 显示socket read time out

查看1521端口也开着,服务也开着,sqlplus也能连上,但PL/SQL Developer和SQL Developer死活连不上,重启系统也不行。 最后,手动重启oracle服务和监听,解决。...
  • dyzhen
  • dyzhen
  • 2015年05月29日 09:24
  • 4629

【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)

问题的引出     在第一章《基本套接字》中,作者给出了一个TCP Socket通信的例子——反馈服务器,即服务器端直接把从客户端接收到的数据原原本本地反馈回去,示例程序当然运行无误。      书上...
  • mmc_maodun
  • mmc_maodun
  • 2013年11月10日 18:35
  • 18876

Java-----Socket中read方法什么时候返回-1

Java-----Socket中read方法什么时候返回-1
  • hekewangzi
  • hekewangzi
  • 2017年03月25日 23:25
  • 707

java.io.IOException: read failed, socket might closed or timeout, read ret: -1

最近项目中连接蓝牙之后接收蓝牙设备发出的指令功能,在连接设备之后,创建RfcommSocket连接时候报java.io.IOException: read failed, socket might c...
  • xiaxiangnanxp1989
  • xiaxiangnanxp1989
  • 2015年07月17日 17:18
  • 12901

Socket 通信中由 read 返回值造成的的死锁问题(socket 阻塞)

Socket 通信中由 read 返回值造成的的死锁问题(socket 阻塞)
  • guiguren
  • guiguren
  • 2016年11月07日 11:21
  • 2458

Linux socket 完整的读写函数

写函数write  ssize_t write(int fd,const void *buf,size_t nbytes) write函数将buf中的nbytes字节内容写入文...
  • likun_tech
  • likun_tech
  • 2012年03月12日 19:34
  • 2199
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:有关socket Read
举报原因:
原因补充:

(最多只允许输入30个字)