码迷,mamicode.com
首页 > 系统相关 > 详细

linux套接字或者文件描述符的未读取得字节数FIONREAD,MSG_PEEK标志

时间:2017-09-26 23:37:49      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:注意   增加   read   str   情况   返回   读数   方法   非阻塞   

FIONREAD,就是返回缓冲区有多少字节
输入有个输入缓冲区,用
int nread;
ioctl(0,FIONREAD,&nread);

能得到缓冲区里面有多少字节要被读取。值放在 nread里面了

然后就可以 read 了。nread = read(0,buffer,nread);

============================================================================

MSG_PEEK标志可以用来读取套接字接收队列中可读的数据,一些情况会用到它,比如为了避免不阻塞而先检查套接字接收队列中可读的数据长度,再采取相应操作。 
当然,不阻塞也可采取其他的方法,例如非阻塞式I/O。

 对于TCP套接字
MSG_PEEK标志会将套接字接收队列中的可读的数据拷贝到缓冲区,但不会使套接子接收队列中的数据减少,常见的是:例如调用recv或read后,导致套接字接收队列中的数据被读取后而减少,而指定了MSG_PEEK标志,可通过返回值获得可读数据长度,并且不会减少套接字接收缓冲区中的数据,所以可以供程序的其他部分继续读取。 
注意:假设指定MSG_PEEK标志,以一个长度为1024字节的缓冲区对一个TCP套接字调用recv,返回100,如果再次调用recv,返回值可能超过100
因为两次调用之间可能有新的数据到达,导致长度增加。 

对于UDP套接字

如果指定了MSG_PEEK,第一次recv加上该标志读取一次,接着不加该标志再读一次,即使另有数据报在这两次调用中间加入该套接字的接收队列,这两个返回值也完全相同。

 

linux套接字或者文件描述符的未读取得字节数FIONREAD,MSG_PEEK标志

标签:注意   增加   read   str   情况   返回   读数   方法   非阻塞   

原文地址:http://www.cnblogs.com/coversky/p/7599333.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!