先看看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認爲它是個無效的參數。
如果總結的不對,可評論或私信,會及時糾正!