这个问题是关于系统调用pread和lseek。 我有套接字类型的文件描述符。每当从网络层读取数据包时,都会向其添加数据。我想知道文件描述符中定期存在的数据量是多少。
我尝试使用系统调用pread和lseek,这样我只知道数据量而不是读取数据本身。但是,这两个调用都没有给出非法搜索错误。套接字类型文件描述符上是否有任何其他系统调用,或者套接字fd上不支持pread和lseek? 。
最佳佳日
答案 0 :(得分:2)
Linux manpages说套接字接口不支持搜索操作:
寻找或调用具有非零位置的pread(2)或pwrite(2)是 套接字不支持。
您可以尝试使用以下标志设置recv
来发出(MSG_PEEK|MSG_DONTWAIT)
,并指定足够大小的缓冲区。
此操作将从套接字的接收缓冲区复制数据,但不会将其弹出,即后续recv
/ read
调用将读取所有相同的数据+更多数据可能会到达套接字所以返回的字节数可能更大。
缓冲区大小是一个非常粘的点 - 它应该大于套接字接收缓冲区,否则你的recv
调用有可能返回你提供的缓冲区中的字节数,但是套接字实际上还有一些。
套接字接收缓冲区的大小可以通过getsockopt
函数获得,选项名称为SO_RCVBUF
。
顺便说一下,我认为更好的选择是实际读取数据并将其保存在缓冲区中。当您阅读了足够的数据时,请使用它执行某些操作。这似乎是一种更好,更常见的方法,而不是在不提取数据的情况下窥视套接字接收缓冲区。
答案 1 :(得分:1)
你不能在套接字句柄上寻找。 pread
有效地执行lseek
然后read
。
最好在循环中调用read
或recv
并使用其中的内容。有关更广泛的答案,请参阅此SO question。