Как проверить, открыт ли сокет TCP без блокировки?
Если я использую usocket
, то чтение из потока сокета будет сигнализировать об окончании файла, если сокет закрыт, но будет заблокируйте это иначе, чего я не хочу. Я пытался использовать (listen stream)
, чтобы заранее проверить, будет ли сокет заблокирован, но (listen)
возвращает nil
в закрытом сокете, что здесь не помогает. Я также попытался проверить (usocket::state socket)
, который дает :READ
для закрытого сокета, но иногда он также дает :READ
для открытого сокета, даже если там ничего нет. Я использую sbcl, поэтому я попытался использовать (sb-bsd-sockets:socket-open-p)
, но это дает T
для закрытого сокета, также не помогает. Единственная команда, которая кажется полезной, это (wait-for-input)
, а именно она будет возвращаться почти сразу же при вызове в закрытом сокете, даже если задано более длительное время ожидания. В то же время, (listen)
все равно будет давать nil
, и это вместе указывает на закрытый сокет. Этот способ выглядит довольно хаки sh для меня.
Есть ли лучший способ?