Сбой сокета Linux TCP - PullRequest
       6

Сбой сокета Linux TCP

4 голосов
/ 04 августа 2011

Я пишу сетевое приложение, которое общается через Linux TCP-сокет. Недавно я заметил, что отправка системного вызова приводит к сбою приложения. Он работает нормально, когда оба узла установлены (сейчас я тестирую восстановление после сбоя). Но когда один узел отключен, второй падает, выполняя этот кусок кода.

    fprintf(stderr, "out_tcp %d\n", out_tcp);
    if(send(out_tcp, &packet, sizeof(packet), 0) == -1) 
        fprintf(stderr, "send TCP error");
    fprintf(stderr, "after send");

Сокет уже подготовлен и подключен и выполнялся несколько раз, прежде чем отключился второй узел. Я ожидал, что этот код возвращает значение -1, но на выходе он выдает только «out_tcp 11», а затем приложение закрывается. Нет сообщения об ошибке, нет возвращаемого значения от отправки. Я запускаю его под Valgrind, он говорит, что приложение выходит нормально - без сообщения об ошибке / предупреждения.

Кто-нибудь знает, как его отладить? Инструменты для использования? Я застрял с этим, так как не получаю никакой информации.

Спасибо заранее Харнен

Ответы [ 3 ]

6 голосов
/ 04 августа 2011

Похоже, ваше приложение игнорирует SIGPIPE. Пожалуйста, смотрите эту тему для получения дополнительной информации:

Как предотвратить SIGPIPE (или правильно обращаться с ними)

1 голос
/ 06 декабря 2012

решено: ИСПОЛЬЗОВАТЬ MSG_EOR, MSG_NOSIGNALflag в функции отправки, как показано ниже

if(send(out_tcp, &packet, sizeof(packet), **MSG_EOR|MSG_NOSIGNAL**) == -1)

Надеюсь, это поможет

0 голосов
/ 04 августа 2011

Вы пытались RTFM (прочитайте прекрасное руководство) об ошибках? Вы ловите или игнорируете какие-либо сигналы? Как насчет глобальной переменной errno?

man send

А также TCP является протоколом потоковой передачи, поэтому рекомендуется использовать обычные команды доступа к потоковой передаче, такие как read (), write (), если вам не нужны специальные флаги.

...