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

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加上该标志读取一次,接着不加该标志再读一次,即使另有数据报在这两次调用中间加入该套接字的接收队列,这两个返回值也完全相同。

时间: 2024-09-30 09:44:32

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

Linux 套接字与文件描述符

端口和套接字,用于确定指定主机上的哪个本地进程使用了哪个协议和哪台远程主机上的哪个进程进行了通信.端口和套接字的使用可以基于以下几点: ①为每个应用过程分配一个过程标识符(Process ID),每次启动一个进程时,这个ID都可能是不同的. ②进程ID因操作系统平台不同而不同,因而它们是不统一的. ③一个服务器过程能够同时与多个客户连接,因而简单的连接标识符不可能是唯一的. 端口和套接字概念提供了一种以统一的方式唯一地标识连接以及参与连接的程序和主机的方法,而不管特定的过程ID. (1)端口 

套接字与文件描述符

  TCP服务器端: int socket(int domain , int type , int protocol) domain(协议族):常用的协议族便是IPV4(PF_INET), IPV6(PF_INET6),本地通信协议的UNIX族(PF_LOCAL) type:数据传输类型:典型数据传输类型:面向连接的套接字(SOCK_STREAM),面向消息的套接字(SOCK_DGRAM) protocal:具体协议: 返回套接字文件描述符,在linux中,不区分套接字和文件,统一用文件描述符来

通过UNIX域套接字传递文件描述符

传送文件描述符是高并发网络服务编程的一种常见实现方式.Nebula 高性能通用网络框架即采用了UNIX域套接字传递文件描述符设计和实现.本文详细说明一下传送文件描述符的应用. 1. TCP服务器程序设计范式 ??开发一个服务器程序,有较多的的程序设计范式可供选择,不同范式有其自身的特点和实用范围,明了不同范式的特性有助于我们服务器程序的开发.常见的TCP服务器程序设计范式有以下几种: 迭代服务器 并发服务器,每个客户请求fork一个子进程 预先派生子进程,每个子进程无保护地调用accept 预先

并发时-修改Linux系统下的最大文件描述符限制

通常我们通过终端连接到linux系统后执行ulimit -n 命令可以看到本次登录的session其文件描述符的限制,如下: $ulimit -n1024 当然可以通过ulimit -SHn 102400 命令来修改该限制,但这个变更只对当前的session有效,当断开连接重新连接后更改就失效了. 如果想永久变更需要修改/etc/security/limits.conf 文件,如下:vi /etc/security/limits.conf* hard nofile 102400* soft no

Linux系统下通过Socket文件描述符寻找连接状态

Proc虚拟文件系统下面有许多数字命名的子目录,这些数字表示系统当前运行的进程号: 其中/proc/N/fd目录下面保存了打开的文件描述符,指向实际文件的一个链接.如下: [[email protected]_10_1_17_138 song_test]# ll /proc/25465/fd total 0 lrwx------ 1 root root 64 Apr 14 09:36 0 -> /dev/pts/4 (deleted) lrwx------ 1 root root 64 Apr

套接字的文件描绘符加入到readfds集结

那么你敲的键应当是回车 RETURN否则不论怎么它都会超时.假定你一个 linebuffered终端上.> 而别的一些则不能.查验早年或许要先看看本体系的manpage如今或许回以为这就是数据报套接字上等候数据的方法--对 或许是有些 Unix体系能够按这种方法.> 能够经过将该中来看是不是有新的联接.毕竟一件对于 select作业:假定你有一个正在侦听 listen套 接字.> 这就是对于函数select要讲的悉数的东西. volumI-IIIbyDouglaE.Comerand In

Linux中对文件描述符的操作(FD_ZERO、FD_SET、FD_CLR、FD_ISSET

在Linux中,内核利用文件描述符(File Descriptor)即文件句柄,来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描述符.读写文件也需要使用文件描述符来指定待读写的文件.宏FD_ZERO.FD_SET.FD_CLR.FD_ISSET中"FD"即为file descriptor的缩写,下面来一一进行介绍. 首先介绍一个重要的结构体:fd_set,它会作为下面某些函数的参数而多次用到,fd_set可以理解为一个集合,这个集合中存放的是文件描述符(

Shell的文件描述符操作,包括标准输入,标准输出,自定义文件描述符

Abstract: 1) Linux Shell 命令的标准输入.标准输出.标准错误,及其重定位: 2)Linux Shell 操作自定义文件描述符: 文件描述符是与文件相关联的一些整数,他们保持与已打开文件的关联.众所周知的文件描述符是标准输入stdin.标准输出stdout.标准错误stderr,我们可以重定位这些文件描述符关联文件的内容到另外一个文件文件描述符. 1. Linux Shell 命令的标准输入.标准输出.标准错误 当我们在编写 shell 脚本时,我们会非常频繁地操作执行命令

文件描述符的复制——实现输出重定向

dup(2)   dup2(2) #include <unistd.h>int dup(int oldfd);功能:复制文件描述符参数:oldfd:指定源文件的描述符返回值:错误 -1 errno被设置成功 返回新的文件描述符 新的文件描述符使用未使用的.最小的文件描述符 int dup2(int oldfd, int newfd);功能:复制文件描述符参数:oldfd:源描述符newfd:目的描述符返回值:错误 -1 errno被设置成功 返回新的文件描述符 1 //利用dup和dup2完成