Кажется, ты прав, Реми. Мне удалось определить, был ли сокет отключен, используя следующий код (он был добавлен в Poco / Net / src / SocketImpl.cpp):
bool SocketImpl::isConnected()
{
int bytestoread;
int rc;
fd_set fdRead;
FD_ZERO(&fdRead);
FD_SET(_sockfd, &fdRead);
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 250000;
rc = ::select(int(_sockfd) + 1, &fdRead, (fd_set*) 0, (fd_set*) 0, &tv);
ioctl(FIONREAD, &bytestoread);
return !((bytestoread == 0) && (rc == 1));
}
Насколько я понимаю, это проверяет, является ли сокет доступным для чтения с помощью вызова select (), а затем проверяет фактическое число байтов, доступных в этом сокете. Если сокет сообщает, что он доступен для чтения, но байты равны 0, то сокет фактически не подключен.
Хотя это отвечает на мой вопрос здесь, к сожалению, это не решило мою проблему с Poco, так как я не могу найти способ исправить это в коде Poco SocketReactor. Я попытался создать новое событие с именем DisconnectNotification, но, к сожалению, не могу вызвать его, поскольку выдается та же ошибка, что и для ReadNotification в закрытом сокете.