Python: остановка процесса получения сокета - PullRequest
2 голосов
/ 11 мая 2011

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

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

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

Ответы [ 2 ]

3 голосов
/ 11 мая 2011

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

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

2 голосов
/ 11 мая 2011
while 1:
    data = conn.recv(4)
    if not data: break
    f.write(data)

Также, пример в документации по Python

...