В принципе, я читал в нескольких местах, что socket.recv()
вернет все, что он может прочитать, или пустую строку, сигнализирующую о том, что другая сторона закрыта (официальные документы даже не упоминают, что она возвращает, когда соединение закрыт... здорово!). Это все прекрасно и денди для блокировки сокетов, так как мы знаем, что recv()
возвращается только тогда, когда на самом деле есть что-то получить, поэтому, когда он возвращает пустую строку, она MUST означает, что другая сторона закрыта соединение, правильно?
Хорошо, хорошо, но что происходит, когда мой сокет не блокируется? Я немного искал (может быть, недостаточно, кто знает?) И не может понять, как сказать, когда другая сторона закрыла соединение, используя неблокирующий сокет. Кажется, нет никакого метода или атрибута, который говорит нам об этом, и сравнение возвращаемого значения recv()
с пустой строкой кажется абсолютно бесполезным... это только у меня есть эта проблема?
В качестве простого примера предположим, что мой тайм-аут сокета установлен на 1.2342342 (любой неотрицательный номер, который вам нравится здесь) секунд, и я вызываю socket.recv(1024)
, но другая сторона ничего не отправляет в течение этого второго периода 1.2342342. Вызов recv()
возвращает пустую строку, и я не знаю, остается ли соединение еще стоять или нет...