首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >客户端崩溃时,recv返回0而不是-1

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

Stack Overflow用户
提问于 2016-04-28 23:58:41
回答 1查看 455关注 0票数 0

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

代码如下:

代码语言:javascript
复制
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中:

代码语言:javascript
复制
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。

我该如何解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2016-04-29 00:31:27

好的,经过研究,我发现我的问题是因为我是一个C插座的菜鸟。即使客户端在套接字上没有close()函数的情况下客户端崩溃,顺便说一句,来自服务器端的recv将返回0。我想它会是return -1或者一些错误。是我的错。我们可以结案了,感谢大家。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36919820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档