c++ - socket::send 后程序在没有核心文件的情况下退出

标签 c++ c sockets

<分区>

这是服务器代码的一部分。当客户端退出时,服务器程序在以下行之后没有核心化就死了:

n = send(s, buf+total, bytesleft, 0);

函数如下:

static ssize_t conn_Send(int s, u8* buf, ssize_t len)
{
  ssize_t total = 0;        // how many bytes we've sent
  ssize_t bytesleft = len;  // how many we have left to send
  ssize_t n;

  while(total < len)
  {
    n = send(s, buf+total, bytesleft, 0);
    //abort();
    if (n < 0)
    {
      return n;
    }
    total += n;
    bytesleft -= n;
  }

  return total;
}

我查看了明显的地方:/proc/sys/kernel/core_pattern 设置正确,如果“//abort();”确实程序退出时带有核心文件。上面已经注释掉了。

有什么想法吗?我已经无计可施了。

最佳答案

When the client exits, the server program dies

n = send(s, buf+total, bytesleft, 0);

这通常是在另一端关闭连接时被 SIGPIPE 杀死的结果。有很多方法可以解决这个问题,包括:

  • 您可以将 setsockoptSO_NOSIGPIPE 一起使用
  • 您可以使用MSG_NOSIGNAL作为发送标志
  • 你可以忽略SIGPIPE

关于c++ - socket::send 后程序在没有核心文件的情况下退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23832171/

相关文章:

c - 用于编译 Allegro5 c 程序的 Makefile

c - Gwan 处理程序状态

C++ 在 SOCKET accept() 方法中失败

windows - 创建通过防火墙可见的本地服务器

javascript - 使用socket.io发送鼠标点击事件

c++ - Callgrind 在动态加载的 SO 中看不到源代码

用于方法组和装饰器的 C++ SFINAE

c++ - volatile sig_atomic_t 的内存安全

c++ - 如果子级覆盖另一个具有相同名称和不同签名的方法,则不会继承基类方法

c - 泥浆编译 - 警告 : cast from pointer to integer of different size