尽管套接字已准备好读取,但读取系统调用返回零字节
Read system call returning zero bytes though the socket is ready for read
我有一个使用 unix 域套接字的 c 语言的客户端-服务器应用程序。
此处服务器正在从客户端读取一个整数。客户端成功向服务器发送 4 个字节。
但在服务器端我可以看到读取系统调用正在从套接字读取 0 个字节。
我非常确定数据可以在服务器上读取,因为读取操作成功之前的 select 调用。
知道为什么会这样吗?
没有任何代码,很难猜测到底发生了什么,但select()
成功并不一定意味着某些数据已准备好读取。
select()
只是承诺,如果您尝试 one 读取此文件描述符,您将不会被阻止。
原因可能是以下任何一个:
- 内核在内部缓冲区中存储了一些数据,这些数据将通过您阅读的文件描述符传递(这正是您在这里所期望的),
- 或文件描述符的另一端被关闭,那么将不会有新的数据被传递(你观察到的EOF),
- 或文件描述符处于读取操作的无效状态,任何读取尝试都会立即失败(读取后请参阅
errno
)。
我有一个使用 unix 域套接字的 c 语言的客户端-服务器应用程序。
此处服务器正在从客户端读取一个整数。客户端成功向服务器发送 4 个字节。
但在服务器端我可以看到读取系统调用正在从套接字读取 0 个字节。
我非常确定数据可以在服务器上读取,因为读取操作成功之前的 select 调用。
知道为什么会这样吗?
没有任何代码,很难猜测到底发生了什么,但select()
成功并不一定意味着某些数据已准备好读取。
select()
只是承诺,如果您尝试 one 读取此文件描述符,您将不会被阻止。
原因可能是以下任何一个:
- 内核在内部缓冲区中存储了一些数据,这些数据将通过您阅读的文件描述符传递(这正是您在这里所期望的),
- 或文件描述符的另一端被关闭,那么将不会有新的数据被传递(你观察到的EOF),
- 或文件描述符处于读取操作的无效状态,任何读取尝试都会立即失败(读取后请参阅
errno
)。