Я работаю над приложением, которое открывает поток данных сокета 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. - Извините за ответы на комментарии внутри самого вопроса, но я создал вопрос до того, как создал учетную запись, и мне не разрешено добавлять комментарии.