客户端崩溃时,recv返回0而不是-1

时间:2016-04-28 15:58:41

标签: c multithreading sockets tcp

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

以下是代码:

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。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

在经过一项研究后,我发现我的问题是如何使用C插座制作一个菜鸟的结果。即使客户端在客户端没有close()函数的情况下崩溃,服务器端的recv也会返回0。我以为它会返回-1或一些错误。我的错。我们可以关闭这一点并感谢大家。