‮Сдвиг по фазе (kincajou) wrote,
‮Сдвиг по фазе
kincajou

А как узнать, что клиент отключился от сервера?

Вот, например, простой случай:
TCP-сервер ждёт подключение. Использует telnet, подключаемся - открывается соединение и всё, что мы пишем в telnet-клиенте, выаливается на консоль сервера. Теперь я закрываю telnet и... сервер понятия не имеет, что соединения больше нет, recv() в блокирующем режиме по-прежнему ждёт, что ему придут какие-то данные.

А если сделать сокет этого соединения неблокирующим, то recv() всё время возвращает ошибку 11 ("Resource temporarily unavailable").

Гадство какое-то.

И победить зомби-сокет не получается (в этом случае уже TCP-соединение).
setsockopt(socket_id, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(int));
shutdown(socket_id, SHUT_RDWR);
close(socket_id);
- да плевать оно хотело, всё равно bind() будет плакать о уже занятом адресе около минуты после того, как процесс был завершён.

Шо в лоб, шо по лбу.
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 10 comments