1. 程式人生 > >linux套接字或者文件描述符的未讀取得字節數FIONREAD,MSG_PEEK標誌

linux套接字或者文件描述符的未讀取得字節數FIONREAD,MSG_PEEK標誌

返回值 strong linu 非阻塞 讀數 減少 另有 如果 第一次

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標誌