2012-08-16 63 views
0

這個問題在系統調用pread和lseek。 我有一個套接字類型的文件描述符。每當從網絡層讀取數據包時都會向其中添加數據。我想知道定期在文件描述符中呈現的數據量是多少。pread和lseek不能在套接字文件描述符上工作

我嘗試使用系統調用pread和lseek,以便我只知道數據量而不是讀取數據本身。但是,這兩個電話都未能提供非法查找錯誤。 socket fd上是否支持套接字類型文件描述符或pread和lseek上的其他系統調用? 。

最佳 佳日

回答

1

Linux manpages說套接字接口不支持查找操作:

交友對象,或調用的pread(2)或PWRITE(2)具有非零位置 不支持插座。

您可以嘗試發行recv,並使用以下標誌設置(MSG_PEEK|MSG_DONTWAIT)指定足夠大小的緩衝區。

該操作將複製來自套接字接收緩衝區的數據,但不會彈出它,即後續的調用將讀取所有相同的數據,並且可能會有更多的數據到達套接字,因此返回的字節數可能會甚至更大。

緩衝區大小是一個非常粘滯的地方 - 它應該大於套接字接收緩衝區,否則您的調用將返回您提供的緩衝區中存在的字節數,但實際上套接字還有一些。

插座接收緩衝區的大小可以通過getsockopt函數獲得,選項名稱爲SO_RCVBUF

順便說一句,我認爲一個更好的選擇將是實際讀取數據並將其保存在某處的緩衝區中。當你讀到足夠的數據時,用它做一些動作。這似乎是一種更好,更普遍的方法,而不是在不提取數據的情況下窺探套接字接收緩衝區。

+0

謝謝你會試用! – 2012-08-17 07:33:15

1

你不能在一個套接字句柄求。 pread有效地做了lseek然後read

最好在循環中調用readrecv並消耗其中的內容。有關更廣泛的答案,請參見SO question

相關問題