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

C 读取系统调用返回零字节,尽管套接字已准备好读取,c,sockets,unix,unix-socket,C,Sockets,Unix,Unix Socket,我有一个c语言的客户机-服务器应用程序,它使用unix域套接字 这里,服务器正在从客户端读取一个整数。客户端成功地向服务器发送了4个字节 但在服务器端,我可以看到读取系统调用正在从套接字读取0字节 我非常确信,由于读取操作之前的select调用正在成功,所以服务器上的数据可以读取 知道为什么会发生这种情况吗?没有任何代码,很难猜测到底发生了什么,但是select()成功并不一定意味着某些数据已经准备好读取 select()只是承诺,如果您尝试从该文件描述符中读取一个,您将不会被阻止。 原因可能是

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

这里,服务器正在从客户端读取一个整数。客户端成功地向服务器发送了4个字节

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

我非常确信,由于读取操作之前的select调用正在成功,所以服务器上的数据可以读取


知道为什么会发生这种情况吗?

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

select()
只是承诺,如果您尝试从该文件描述符中读取一个,您将不会被阻止。 原因可能是:

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

如果(rc=read(fd,buff,sizeof buff)==0),请创建一个括号,并在
中添加括号。
?;-)>使用unix域套接字的c中的tcp客户机服务器应用程序这没有意义。TCP是一种协议,存在于AF_INET地址家族中,因此可以位于IP之上。Unix域套接字是另一个地址族。您不能将TCP置于Unix域套接字之上。
我非常确定
。。。错误出现在代码中未显示usThanks@prog fh的部分。很明显,第二个案例被程序击中了。