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



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

这是代码:

if(setsockopt(receive_sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout))<0){
  printf("errore sock option rcvtimeon");
  exit(EXIT_FAILURE);
}
if(setsockopt(receive_sock, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout))<0){
  printf("errore sock option sndtimeon");
  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]= '';
  return ret;
}

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

我该如何解决此问题?

好的,经过研究,我发现我的问题是如何通过C套接字解决的。即使客户端在套接字上没有close()函数的情况下崩溃,服务器端的recv也会返回0。我以为它会返回-1或一些错误。我的错。我们可以结束这一切,感谢大家。

最新更新