Мне пришлось забульбенить логгер, чтобы понять эту простую истину: если клиент закрыл со своей стороны сокет, то read() вернет 0, как если бы данных не было, а select() спокойно отработает. Вывод таков. Нельзя писать
if(!(rd = read(sock, buff, BUFLEN-1))) continue;
после вызова select(), надеясь, что ошибка произойдет в select() и соответствующим образом будет выявлена. Ни в коем разе! select() скажет, что данные на входе есть. А вот read() в этом случае вернет не отрицательное значение, а 0!
В общем, писать надо так:
if(!(rd = read(sock, buff, BUFLEN-1))){
putlog("socket closed. Exit");
break;
}
Journal information