Python: остановить процесс получения сокета

Я получаю данные с какого-то устройства через сокет-модуль. Но через какое-то время устройство перестает отправлять посылки. Затем я хочу прервать цикл for. Пока True не работает, потому что он получает более 100 пакетов. Как я могу остановить этот процесс? s означает сокет.

...
for i in range(packages100):
    data = s.recv(4)
    f.write(data)
...

Изменить: я думаю, что socket.settimeout() является частью решения. См. также: Как установить тайм-аут для метода recv сокета python?< /а>


person kame    schedule 11.05.2011    source источник
comment
Нет ли способа узнать, сколько пакетов клиент захочет получить?   -  person bpgergo    schedule 11.05.2011
comment
Остановить процесс не проблема. Проблема заключается в том, чтобы решить, когда это сделать. Каковы критерии?   -  person Kylotan    schedule 11.05.2011
comment
Я хочу остановить процесс через одну секунду без получения данных.   -  person kame    schedule 11.05.2011


Ответы (2)


Если ваш одноранговый узел действительно просто прекращает отправку данных, а не закрывает соединение, это сложно, и вам придется прибегнуть к асинхронному чтению из этого сокета.

Поместите его в асинхронный режим (документы и Google — ваши друзья) и пытайтесь читать его каждый раз вместо блокировки чтения. Затем вы можете просто перестать «пытаться» в любое время. Обратите внимание, что по природе асинхронного ввода-вывода ваш код будет немного другим — вы больше не сможете предполагать, что когда recv вернется, он действительно прочитает некоторые данные.

person Eli Bendersky    schedule 11.05.2011

while 1:
    data = conn.recv(4)
    if not data: break
    f.write(data)

Кроме того, пример в документации по python

person bpgergo    schedule 11.05.2011
comment
А, понятно. Таким образом, устройство прекращает отправку пакетов, что не равносильно закрытию мошенника. - person bpgergo; 11.05.2011
comment
Ну, может быть, а может и нет, я не могу быть уверен, что означает ОП. Я просто хотел указать на разницу - person Eli Bendersky; 11.05.2011