Программа выходит без файла ядра после socket :: send [closed]

0

Это часть кода сервера. Когда клиент выходит, программа сервера умирает без coring после следующей строки:

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();" прокомментирован выше.

Есть идеи? Я нахожусь в конце.

  • 1
    Используйте отладчик, чтобы выяснить, что происходит. Я не понимаю, как мы могли бы помочь вам в этом, нам нужен весь стек вызовов и соответствующий код.
  • 0
    Если n <0, вы должны немедленно вызвать perror () или друзей.
Теги:
sockets

1 ответ

1
Лучший ответ

Когда клиент выходит, программа сервера умирает

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

Обычно это результат того, что SIGPIPE убит, когда другой конец закрывает соединение. Существует немало способов обойти это, в том числе:

  • Вы можете использовать setsockopt с SO_NOSIGPIPE
  • Вы можете использовать MSG_NOSIGNAL в качестве флага send
  • Вы можете игнорировать SIGPIPE
  • 0
    Спасибо за быстрый ответ. Я побежал через GDB и получил «Программа прервана с сигналом SIGPIPE, Broken pipe. Программа больше не существует». Я буду пытаться SO_NOSIGPIPE.
  • 0
    @fission Вы также можете получить довольно хорошее представление о том, как он умер, проверив состояние возврата $? ,

Ещё вопросы

Сообщество Overcoder
Наверх
Меню