尽管套接字已准备好读取,但读取系统调用返回零字节

Read system call returning zero bytes though the socket is ready for read

我有一个使用 unix 域套接字的 c 语言的客户端-服务器应用程序。

此处服务器正在从客户端读取一个整数。客户端成功向服务器发送 4 个字节。

但在服务器端我可以看到读取系统调用正在从套接字读取 0 个字节。

我非常确定数据可以在服务器上读取,因为读取操作成功之前的 select 调用。

知道为什么会这样吗?

没有任何代码,很难猜测到底发生了什么,但select()成功并不一定意味着某些数据已准备好读取。

select() 只是承诺,如果您尝试 one 读取此文件描述符,您将不会被阻止。 原因可能是以下任何一个:

  • 内核在内部缓冲区中存储了一些数据,这些数据将通过您阅读的文件描述符传递(这正是您在这里所期望的),
  • 文件描述符的另一端被关闭,那么将不会有新的数据被传递(你观察到的EOF),
  • 文件描述符处于读取操作的无效状态,任何读取尝试都会立即失败(读取后请参阅errno)。