EndlessPythonQuestions Ответов: 1

Возвращает ли метод Python 2.7 socket. accept () блокирующий сокет или неблокирующий сокет?


Используя модуль сокетов в Python 2.7:

1. Я получил объект сокета из гнезда.метод accept ().
2. я проверил тайм-аут объекта сокета, и он вернул -1.0. я думаю, это означает, что объект сокета находится в режиме блокировки.
3. однако, когда я вызываю метод recv на объекте сокета, я получаю ошибку:
[Errno 10035] неблокирующая операция сокета не может быть завершена немедленно
4. Эта ошибка имеет смысл только в том случае, если объект сокета не блокируется. Объект сокета должен блокироваться до тех пор, пока не поступят данные.

Почему объект сокета не блокируется, когда он должен быть блокирующим?

Примечание: Я установил тайм-аут на сокете, который вызвал метод accept (). Может ли это быть причиной того, что возвращаемый объект сокета также не блокируется? Если да, то я был бы благодарен услышать объяснение того, почему это происходит.

def wait_for_connection(self):
    connection, client_address = self.sock.accept()
    print 'connected to ' + str(client_address)
    self.connections.append(connection)


def read_from_connections(self):
    for connection in self.connections:
        try:
            command = connection.recv(1024)
            if command:
                print command
        except socket.error, error:
            print error  # error 10035.
            print connection._sock.timeout  # returns -1
            if error.errno != errno.EWOULDBLOCK:
                raise



Что я уже пробовал:

Я попытался найти свойство blocking_mode где-то внутри объекта socket с помощью встроенного метода dir (), но безуспешно. Поэтому я использовал свойство timeout в качестве индикатора того, блокирует сокет или не блокирует. Пожалуйста, дайте мне знать, если это предположение неверно.

1 Ответов

Рейтинг:
2

Richard MacCutchan

Вместо того чтобы гадать, лучше обратиться к документации по адресу Разъем программирования методические указания — документации по языку Python 2.7.13 [^] где это ясно объясняется.