T>Я хочу сделать в своем клиенском приложении поддержку keep-alive (знаю, что сервер опцию поддерживает). T>Я выставляю сокету опцию SO_KEEPALIVE. При этом сервер видит это и не закрывает соединение.
У тебя протокол какой. Я понимаю, что TCP, а выше TCP — что?
T>Вопрос — кроме выставление флага SO_KEEPALIVE, нужно ли держать сокет открытым (не делать closesocket)? T>Но в этом случае непонятно, зачем нужен SO_KEEPALIVE, ведь сервер и так видит, что клиент не отсоединился и может ждать новых запросов.
SO_KEEPALIVE нужен, чтобы если соединение формально открыто, но фактически никакие данные по нему долгое время не ходят, и если вдруг соединение по каким-то причинам сломается (ну, например, пришла мышка, перегрызла кабель), то обе стороны в конечном итоге заметили потерю соединения и закрыли его. Ну там, для порядку и экономии ресурсов.
Только вот TCP keep-alive плохо справляется с этой задачей. И толку от него не очень-то много.
Лучше сделать аналог прикладного уровня, если протокол позволяет.