pread和lseek不能处理套接字文件描述符

时间:2012-08-16 05:59:56

标签: sockets system-calls

这个问题是关于系统调用pread和lseek。  我有套接字类型的文件描述符。每当从网络层读取数据包时,都会向其添加数据。我想知道文件描述符中定期存在的数据量是多少。

我尝试使用系统调用pread和lseek,这样我只知道数据量而不是读取数据本身。但是,这两个调用都没有给出非法搜索错误。套接字类型文件描述符上是否有任何其他系统调用,或者套接字fd上不支持pread和lseek? 。

最佳

佳日

2 个答案:

答案 0 :(得分:2)

Linux manpages说套接字接口不支持搜索操作:

  

寻找或调用具有非零位置的pread(2)或pwrite(2)是   套接字不支持。

您可以尝试使用以下标志设置recv来发出(MSG_PEEK|MSG_DONTWAIT),并指定足够大小的缓冲区。

此操作将从套接字的接收缓冲区复制数据,但不会将其弹出,即后续recv / read调用将读取所有相同的数据+更多数据可能会到达套接字所以返回的字节数可能更大。

缓冲区大小是一个非常粘的点 - 它应该大于套接字接收缓冲区,否则你的recv调用有可能返回你提供的缓冲区中的字节数,但是套接字实际上还有一些。

套接字接收缓冲区的大小可以通过getsockopt函数获得,选项名称为SO_RCVBUF

顺便说一下,我认为更好的选择是实际读取数据并将其保存在缓冲区中。当您阅读了足够的数据时,请使用它执行某些操作。这似乎是一种更好,更常见的方法,而不是在不提取数据的情况下窥视套接字接收缓冲区。

答案 1 :(得分:1)

你不能在套接字句柄上寻找。 pread有效地执行lseek然后read

最好在循环中调用readrecv并使用其中的内容。有关更广泛的答案,请参阅此SO question