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

标签 c multithreading sockets tcp

我必须在多线程 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。

我该如何解决?

最佳答案

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

关于c - 当客户端崩溃时,recv 返回 0 而不是 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36919820/

相关文章:

c - 为什么此代码在 for 循环 C 中时仅评估第一个字符

python - 如何使客户端套接字以非阻塞方式从另一个套接字接收数据?

java - java套接字的问题

c - C中的printf如何对 float 进行舍入?

c++ - 通过管道与 PuTTY 通信

multithreading - C++ 中的内存栅栏/屏障 : does boost or other libraries have them?

java - 使用线程和 USB 连接后应用程序屏幕空白

java - 套接字的输入流不可读

c - 自然排序与 qsort 不起作用

java - 在 Open Shift/Docker 环境中基于 java 的 Restful Web 服务中使用多线程有哪些缺点?