Уведомления

Группа в Telegram: @pythonsu

#1 Март 26, 2011 16:58:42

dezz
От:
Зарегистрирован: 2009-09-20
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

socket.recv(bufsize)

def get(host, path):
header = "GET " + path + " HTTP/1.1\r\n"
header += "Host: " + host + "\r\n"
header += "Connection: Close\r\n\r\n"

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, 80))
s.send(header)
return s.recv(1024)
С помощью s.recv получаю 1024 байт ответа. Вопрос: как узнать полный размер ответа, для его полного получения?



Офлайн

#2 Март 26, 2011 17:00:55

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

socket.recv(bufsize)

dezz
С помощью s.recv получаю 1024 байт ответа. Вопрос: как узнать полный размер ответа, для его полного получения?
Если сервер не устанавливает заголовок “Content-Length” - никак.



Офлайн

#3 Март 26, 2011 17:13:19

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

socket.recv(bufsize)

dezz
С помощью s.recv получаю 1024 байт ответа. Вопрос: как узнать полный размер ответа, для его полного получения?
для получения всех данных не обязательно знать объем, можно в цикле вызывать recv пока не получим все данные.

Офлайн

#4 Март 26, 2011 17:35:22

dezz
От:
Зарегистрирован: 2009-09-20
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

socket.recv(bufsize)

Спасибо за ответы :)
Собственно оба варианта подходят, но лучше циклом пройтись.



Офлайн

#5 Март 26, 2011 19:08:12

dezz
От:
Зарегистрирован: 2009-09-20
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

socket.recv(bufsize)

Всё оказалось не так просто.
Как оказалось сервер отправляет ответ чанками и в ответе нет заголовка “Content-Length”.
Если вызывать recv циклом, то программа подвисает, как мне сказали, наверно из-за того, что сервер не подчинается заголовку “Connection: Close”

Какие ещё есть идеи?
urllib не предлогать :)



Офлайн

#6 Март 26, 2011 19:21:41

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

socket.recv(bufsize)

dezz
Всё оказалось не так просто.
Как оказалось сервер отправляет ответ чанками и в ответе нет заголовка “Content-Length”.
Если вызывать recv циклом, то программа подвисает, как мне сказали, наверно из-за того, что сервер не подчинается заголовку “Connection: Close”
используйте таймаут.

Офлайн

#7 Март 29, 2011 05:21:15

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

socket.recv(bufsize)

Если серв не посылает Content-Length, то определить, передался ли полностью файл, невозможно. Алсо какой смысл не разрывать соединение? Keep-alive? Если послать следующий запрос, как отделить первый файл от второго?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version