На своем сервере я проверяю, готов ли какой-либо сокет к чтению, используя select()
, чтобы определить его.В результате основной цикл select()
выполняется каждый раз, когда он повторяется.
Для проверки сервера я написал простой клиент, который отправляет только одно сообщение, а затем завершает работу.КСТАТИ.Я использую буферы протокола для отправки информации - сообщение означает объект класса типа Message в этой библиотеке.
Сеанс теста выглядит следующим образом:
select()
- сокет сервера готов к чтению
accept()
сокет клиента - чтение сообщения из сокета клиента
select()
- сокет сервера не готов к чтению, клиентскийодин готовый
- чтение сообщения из клиентского сокета
Последний шаг неверен, поскольку клиент уже закрыл соединение.В результате библиотека protobuf получает Segmentation fault
.Интересно, почему FD_ISSET говорит, что сокет готов на шаге 6, когда он закрыт.Как я могу проверить, закрыта ли розетка?
РЕДАКТИРОВАТЬ:
Я нашел, как проверить, открыта ли розетка
int error = 0;
socklen_t len = sizeof (error);
int retval = getsockopt (socket_fd, SOL_SOCKET, SO_ERROR, &error, &len );