Какие сигналы лучше обрабатывать на TCP-сервере?

Я пишу TCP-сервер. Все, что ему нужно сделать, это прочитать/записать текст в/из сокетов TCP и прочитать/записать этот текст в/из текстовых файлов в файловой системе, где работает сервер.

Если есть проблема с соединением (например, клиент закрывает сокет), сервер, заблокированный на чтение/запись, получает сигнал SIGPIPE. Я хочу игнорировать это: сервер просто закрывает конец своего сокета, потому что связь теперь невозможна. Это хороший способ?

Есть ли другие сигналы, которые я должен учитывать?


person JustTrying    schedule 07.06.2012    source источник


Ответы (3)


Многие серверные программы игнорируют SIGPIPE и используют коды возврата из read/write, чтобы лучше понять причину отключения. Например, read/recv возвращает 0 при правильном отключении от другого конца и -1 при ошибке с errno, установленным в один из нескольких вариантов.

person Some programmer dude    schedule 07.06.2012
comment
sendto/sendmsg может принимать флаг, чтобы избежать генерации SIGPIPE, что также является достойной альтернативой. Я никогда не хочу уродливых зависимостей между моим сетевым кодом и моим кодом обработки сигналов (если они есть), поэтому я всегда использую либо этот метод, либо блокирую SIGPIPE вокруг кода отправки и удаляю и, возможно, жду SIGPIPE перед его разблокировкой. Это позволяет избежать изменения или зависимости от глобального состояния (расположения сигнала) вызывающего кода. - person R.. GitHub STOP HELPING ICE; 07.06.2012

Вы также можете реализовать обработчик прерываний, в случае сбоя сервера вы можете выполнить некоторые операции перед закрытием.

например SIGINT

void interrupt_handler(int sig){
    endloop = 1;
    close(sd);
    printf("Interrupt recieved: shutting down server!\n");
    return;
}

int main(int argc, char** argv){

    //all typical TCP socket functions

    signal(SIGINT, interrupt_handler);

    while(!endloop){

      //service loop

    }

}
person Matteo    schedule 07.06.2012

Если сервер является процессом демона, обычной практикой является использование SIGHUP для перезапуска или повторной инициализации сервера. Однако ответ @Joachim является наиболее важным: поведение клиента не должно приводить к остановке сервера.

Примечание. В связи с асинхронностью существуют ограничения. какие сигналы обработчики могут безопасно выполнять.

person Brett Hale    schedule 07.06.2012
comment
Было бы неплохо уточнить последний пункт и отметить, что, если вы не являетесь экспертом в правилах обработки сигналов, вероятно, лучше ничего не делать в обработчике сигналов, а вместо этого информировать основной поток программы о том, что он должен действовать. при ближайшей возможности (например, с самовывозом). - person R.. GitHub STOP HELPING ICE; 07.06.2012