带有 MSG_PEEK 的 C 'recv' 不返回 -1

jon*_*ham 0 c c++ sockets recv peek

我正在编写一个 C 函数来检查来自客户端的套接字连接是否可用。我使用带有 MSG_PEEK 的 'recv' 函数来不改变输入缓冲区。

但是,当客户端关闭套接字连接时,'recv' 应该返回 -1,但事实并非如此。客户端关闭后,下面函数中的'recv'一直返回0。

char is_avail(int connection) {
  char buffer;

  int result = recv(connection,&buffer,1,MSG_PEEK);
  if (result<0)
    return 0;
  else
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

这件事有什么理由吗?我还想将 MSG_PEEK 与 MSG_WAITALL 结合使用。我试过:

recv(connection,&buffer,1,MSG_PEEK|MSG_WAITALL);
Run Code Online (Sandbox Code Playgroud)

但它不会生效。

ATa*_*lor 5

当套接字正确关闭时,recv 不会返回 -1,而是“0”。

0 -> 优雅地关闭套接字

-1-> 发生了实际错误

> 0-> 数据已读取。

  • @PaulDinh 不,不是。如果没有要读取的数据,则根本不返回。它阻塞,直到有数据要读取。一个例外:当您将套接字设置为非阻塞时。在这种情况下,如果没有数据,recv 将返回 -1。recv 返回“0”的唯一时间是连接实际关闭时。 (2认同)