【问题标题】:recv returns 0 instead of -1 when client crashes当客户端崩溃时,recv 返回 0 而不是 -1
【发布时间】:2016-08-23 12:31:30
【问题描述】:

我必须在多线程 linux TCP 服务器中实现一个套接字,该服务器在超时后断开连接,两个 setsockopt 设置为 SO_RCVTIMEO 和 SO_SNDTIMEO。

代码如下:

if(setsockopt(receive_sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout))<0){
  printf("errore sock option rcvtimeo\n");
  exit(EXIT_FAILURE);
}

if(setsockopt(receive_sock, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout))<0){
  printf("errore sock option sndtimeo\n");
  exit(EXIT_FAILURE);
}

在与此套接字关联的线程产生后,服务器通过此函数保持在 recv 中:

int receive_message(int descriptor, char* buffer){

  memset(buffer,0,sizeof(buffer));
  int ret;
  while((ret= recv(descriptor, buffer, BUFFER_SIZE-1, MSG_NOSIGNAL))<=0){
    if (errno == EWOULDBLOCK || errno == EPIPE){
      //stuff...
      pthread_exit(NULL);
    }
    else if (errno == EINTR) continue;
    else exit(EXIT_FAILURE);
  }
  buffer[ret]= '\0';

  return ret;
}

如果客户端保持在线但没有响应,它将被 if (errno == EWOULDBLOCK || errno == EPIPE) 语句正确终止,但如果客户端崩溃或被终止,则接收的 ret 值在 while 循环中将永远为 0,而不是 -1 或 EWOULDBLOCK。

我该如何解决这个问题?

【问题讨论】:

  • 检查0 并处理它?来自手册页:“对于 TCP 套接字,返回值 0 表示对等方已关闭连接的一半。”
  • 我认为当客户端崩溃时,recv 将返回-1。我的错,谢谢!
  • 顺便说一句:memset(buffer,0,sizeof(buffer)); 是货物崇拜编程。并且 errno 仅在 recv() 返回 -1 后才有用。在 recv() 返回 >= 0 时,errno 没有任何意义。

标签: c multithreading sockets tcp


【解决方案1】:

好的,经过研究,我发现我的问题是如何使用 C 套接字作为菜鸟的结果。即使客户端在客户端在套接字上没有 close() 函数的情况下崩溃,来自服务器端的 recv 也会顺便返回 0。我认为它会返回 -1 或一些错误。我的错。我们可以关闭它,感谢大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多