繁体   English   中英

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

[英]recv returns 0 instead of -1 when client crashes

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

这是代码:

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值将为0永远在while循环中而不是-1或EWOULDBLOCK。

我该如何解决?

好的,经过研究后,我发现我的问题是对带有C插槽的菜鸟的结果。 即使客户端崩溃,并且客户端的套接字上没有close()函数,来自服务器端的recv也会返回0。 我以为它将返回-1或某些错误。 我的错。 我们可以结束这个,谢谢大家。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM