2014-01-11 6 views
-1

Я могу открыть соединение с помощью gevent.socket.create_connectionтаймаут в gevent.socket

self.socket = socket.create_connection(self.address,timeout=timeout) 
... 
payload = "" 
while len(payload) < length: 
    b = self.socket.recv(length - len(payload)) 
    payload += b 
... 
print payload 

однако спустя некоторое время recv терпит неудачу и вызывает socket.timeout исключение.

Любая идея, что может вызвать такое исключение? И будет просто цикл до тех пор, пока recv не вернет строку, т. Е. Это все равно позволит обнаружить регулярные отключения?

ответ

0

Я могу только предположить, что тайм-аут достигнут, и он вызывает исключение тайм-аута, которое я считаю нечетным, поскольку я не могу воспроизвести это, соединение просто закрывается, если я создаю сокет и даю ему время ожидания. Вот цитата из документов из gevent.socket.create_connection:

Passing необязательный параметр тайм-аута будет установить тайм-аут на экземпляре сокета, прежде чем пытаться подключиться. Если тайм-аут не установлен, используется глобальный тайм-аут по умолчанию, возвращаемый функцией getdefaulttimeout().

getdefaulttimeout() по умолчанию None, что означает, что розетка не будет иметь таймаут.

Вы должны всегда контактировать, пока не получите все данные или до socket.recv() возвращает пустую строку. Это означает, что соединение было закрыто (по какой-либо причине). Это относится и к gentent-сокетам.

Я процитировать socket howto:

Когда RECV возвращает 0 байт, это означает, что другая сторона закрыта (или находится в процессе закрытия) соединение. Вы не получите больше данных об этом соединении. Когда-либо.

Ваш цикл должен выглядеть так, чтобы обрабатывать пустую строку случай:

self.socket = gevent.socket.create_connection(self.address) # if timeout is necessary, make sure you add a high enough value. 

payload = "" 
while len(payload) < length: 
    b = self.socket.recv(length - len(payload)) 
    if not b: 
     break # or return, or raise an exception. 
    payload += b