Есть сервер, который обслуживает запросы клинетов. После эксепта запросы слушает poll в отдельном потоке. все примерно выглядит так:
sd[i].fd = accept ( lsock.fd, 0, 0 ); if ( sd[i].fd < 0 ) perror("accept"); else { sd[i].events = POLLIN | POLLHUP; count++; . . . }
if ( (result = poll (&sd, count, 1000)) > 0 ) { for (i; i<count; i++) { if ( sd[i].revents & POLLIN ) {//recive data len = sizeof(struct sockaddr_in); if( getpeername(sd[i].fd, (struct sockaddr*) &name, &len) != 0) { perror ("getpeername"); } else { обрабатываю данные } else if (sd[i].revents & POLLHUP) { закрываю соединение (сокет) } } и так далее
так вот функция getpeername периодически выдает ошибку "Transport endpoint is not connected" что это значит ? может в тот промежуток времени, между приходом данных и до того момента как функция getpeername начнет определять адрес отправителя, сокет закрывается ? или причина в другом ? может сначала стоит обрабатывать POLLHUP, а потом уже POLLIN? и как с этим бороться ? и еще вопрос: как можно определить, жив ли еще клиент на той стороне соединения?
}