ioctl() FIONREAD 檢測socket是否有數據可讀

先看看FIONREAD 的作用

FIONREAD:

Get the number of bytes in the input buffer 獲取接收緩存中數據的字節數

項目中用來判斷tcp socket是否有數據接收到,但是出現了一個問題,對於用於accept的socket 即調用listen()之後的socket,用FIONREAD,判斷的時候報錯,ioctl()返回-1,錯誤碼是 22,無效的參數錯誤。

爲什麼會出現這個問題?

我做過測試剛創建好的socket 和 調用過bind()的socket  ioctl 都可以判斷,只有listen()之後纔會報錯。

於是就查了一下 socket創建過程,總結了一下

1.socket創建之後是主動(暫且這麼翻譯吧),listen之後就變爲被動,只能等待connect。

listen() marks the socket referred to by sockfd as a passive socket

2.socket創建之初的狀態是UNCONNECT, listen之後就變爲LISTEN狀態。

3.listen()調用之後,維護的是未完成連接和完成連接兩個隊列,socket也會被放置到隊列裏。

4.connect 創建新的socket用於和客戶端通訊。

FIONREAD用於判斷接收緩存中是否存在可讀數據,用於accept的socket處於LISTEN狀態,只能被動接受連接,實際上已經沒有IO了,不能用FIONREAD去判斷socket是否有連接,ioctl認爲它是個無效的參數。

如果總結的不對,可評論或私信,會及時糾正!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章