C - «Отказано в соединении» на уже открытом сокете - PullRequest
3 голосов
/ 31 августа 2011

Я работаю над приложением, которое открывает поток данных сокета TCP для другого. После того, как соединение открыто и принято сервером, я отправляю сообщение «логин», которое успешно принимается сервером, сервер пытается отправить сообщение «успех». Здесь все становится странно.

Запись на сервер завершается неудачно, и для errno установлено значение "Разбитый канал". Клиент опрашивает дескриптор файла, ожидая чтения данных, что также не удается. На нем установлено значение «Отказано в соединении».

Все соединения являются TCP на устройстве обратной связи. Используя tcpdump, я вижу, что FIN отправляется с клиента на сервер. Его можно найти здесь .

Как может ошибочно быть "Отказано в соединении", если соединение уже установлено? Что может вызвать это поведение? Код клиента является синхронным без каких-либо потоков, и никто больше не имеет доступа к дескриптору файла.

Если это имеет значение, сервер является менеджером Asterisk.

Фрагменты клиентского кода (в реальном коде есть проверка ошибок, отдельные функции и т. Д.):

struct sockaddr_in sa;
int fd;

fd = sock_socket(SOCK_STREAM, 0, 0);.
MZERO(sa);
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = inet_addr("127.0.0.1");
sa.sin_port = htons(MANAGER_PORT);

connect(fd, (struct sockaddr *)&sa, sizeof(sa));
sprintf(buf,
    "Action: Login\r\n"
    "Username: %s\r\n"
    "Secret: %s\r\n"
    "Events: %s\r\n"
    "ActionID: %d\r\n"
    "\r\n",
    MANAGER_USERNAME, MANAGER_PASSWORD, events, manager_action_id++)

write(fd, buf, strlen(buf));

{
    struct pollfd fds = {fd, POLLIN, 0};

    if (poll(&fds, 1, timeout) <= 0)
        return -1; /* This is where the client fails with "Connection refused" */
}

Спасибо!

P.S. - Извините за ответы на комментарии внутри самого вопроса, но я создал вопрос до того, как создал учетную запись, и мне не разрешено добавлять комментарии.

1 Ответ

0 голосов
/ 27 февраля 2012

Что касается "Broken Pipe", я думаю, вы пытаетесь записать некоторые вещи в закрытый сокет, чтобы в этом случае был выпущен сигнал SIG_PIPE. Объявите <signal.h> и установите операции с сигналом таким образом, как signal(SIG_PIPE,SIG_IGN)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...