Не удалось выйти из цикла Python - PullRequest
1 голос
/ 21 сентября 2009

Я хочу выйти из цикла, когда нет данных, но кажется, что цикл останавливается на recvfrom

image=''
while 1:
        data,address=self.socket.recvfrom(512)
        if data is None:break
        image=image+data
        count=count+1
        print str(count)+' packets received...'

Ответы [ 4 ]

4 голосов
/ 21 сентября 2009

Попробуйте установить на неблокирующую розетку . Вы должны сделать это до начала цикла. Вы также можете попробовать сокет с таймаутом .

2 голосов
/ 21 сентября 2009

recvfrom действительно может остановиться (в ожидании данных), если вы не установили в свой сокет неблокирующий режим или режим ожидания. Более того, если сокет закрывается сокетом от вашего коллеги, указание «сокет был закрыт, больше ничего не получено» это не значение None для data - это пустая строка 1006 *. Таким образом, вы можете изменить свой тест на if not data: break для большей общности.

0 голосов
/ 21 сентября 2009

Возможно, вы захотите установить socket.setdefaulttimeout (n) для выхода из цикла, если по истечении указанного периода времени данные не возвращаются.

0 голосов
/ 21 сентября 2009

Какой режим блокировки вашего сокета?

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

Однако, если вы переключитесь в неблокирующий режим (см. Socket.setblocking (flag)), я думаю, что это вызовет исключение, которое вам придется перехватывать, а не проверять ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...