Я реализую сервер, на котором я слушаю, как клиент подключается с помощью вызова сокета accept.Время разрыва между сокетами, т.е. Accept() и recv/send calls
После того, как принимается прием, и я получаю сокет, я жду около 10-15 секунд, прежде чем совершать первый вызов recv/send.
Отправленные вызовы клиенту завершаются ошибкой с errno = 32 i.e broken pipe.
Поскольку я не контролирую клиента, у меня есть опция сокета * SO_KEEPALIVE * в принимаемом сокете.
const int keepAlive = 1;
acceptsock = accept(sock, (struct sockaddr*)&client_addr, &client_addr_length)
if (setsockopt(acceptsock, SOL_SOCKET, SO_KEEPALIVE, &keepAlive, sizeof(keepAlive)) < 0)
{
print(" SO_KEEPALIVE fails");
}
Не могли бы вы рассказать, что может быть неправильным здесь и как мы можем предотвратить закрытие клиентского сокета?
Примечание Одна вещь, которую я хочу добавить, что если нет разрыва во времени или менее чем за 5 секунд между принимать и отправлять/вызовы ПРИЕМ, происходит связь клиент-сервер, как ожидалось.
В Linux вы можете получить errno = 32 для ошибки: ENOTCONN также, что означает сокет не подключен, и цель не указана. Посмотрите, что сделанные вами системные вызовы перед запуском send/recv не возвращают ошибки. – Aravind
Вы подтвердили, что 'connect()' на самом деле преуспел, и уведомил вас, что полное соединение было доступно до того, как вы начали называть 'send()'? Сокеты обычно не закрываются после простоя, а 10-15 секунд - слишком короткое время для «SO_KEEPALIVE» для закрытия мертвого соединения, а 10-15 секунд - слишком короткое время для внешнего брандмауэра/маршрутизатора для закрытия незанятое соединение. Так происходит что-то еще. Я предполагаю, что вы просто не управляете своим клиентским сокетом правильно. –
@ Aravind и Remy .. Да, connect() преуспевает, потому что accept calls, который блокирует, дает действительный accpetsock. Кроме того, данные принимаются от клиента также дважды или трижды, прежде чем я получу ошибку 32.Как я уже упоминал, я не владею клиентом, а клиент работает, если нет ожидания между вызовами accept и send/receive. – Rajat