Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 17, 2010 13:39:07

diam123
От:
Зарегистрирован: 2008-10-23
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

TCP/IP MTU HTTP Как получить один пакет ?

Здравствуйте, уважаемые, появился такой вопрос :
Имеется код вида

import socket

try:
sock = socket.create_connection(("http://www.google.com", 80)) #Хост не важен
sock.send("GET /\r\n\r\n")#Запрос в принципе тоже
a = sock.recv(4096)
print a
sock.shutdown(socket.SHUT_RD)
sock.send("GET /\r\n\r\n")
a = sock.recv(4096)
print u"="*80
print a
except Exception, e:
print e
Указанный выше пример работает именно так как и должен, но не так как мне хочется - а именно, не дает получить ответ от второго запроса, возбуждая ошибку 10053

Понимаю, что там написано что-то жуткое, но суть в общем такова:
Есть необходимость опрашивать по протоколу HTTP большое количество серверов, НО мне необходимо получить только код ответа веб-сервера, т.е. исключительно первую строку вида “HTTP/1.0 200 OK” или что там. Проблема в том, что я хочу получить только ее, именно получить, а не прочитать. Еще я хочу сделать это таким образом, чтобы и сокет не закрыть.
Приблизительно я это вижу так :
1. - Установка соединения.
2. - Установка MTU в необходимое мне значение именно так, чтобы я мог получить именно то что мне нужно.
3. - Посылаю серверу свой запрос, получаю от него именно один пакет, после чего имитирую закрытие соединения.
4. - Распаковка пакета, обработка и т.д. и т.п.

Собственно вопрос - реал/анриал ?
Или трудозатраты на все это будут выше ожидаемого результата ?

Или я вообще бред написал ? :)



Отредактировано (Апрель 17, 2010 13:39:58)

Офлайн

#2 Апрель 17, 2010 16:24:29

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

TCP/IP MTU HTTP Как получить один пакет ?

1. открыть соединение
2. отправить/получить данные
3. закрыть соединение

и так каждый раз

“sock.shutdown(socket.SHUT_RD)” - блокирует получение данных, поэтому и нельзя после данные получить
“a = sock.recv(4096)” - ответ приходит в первых байтах, поэтому не обязательно считвыать все 4кб

Офлайн

#3 Апрель 17, 2010 21:53:24

diam123
От:
Зарегистрирован: 2008-10-23
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

TCP/IP MTU HTTP Как получить один пакет ?

Спасибо за внимание, но такой вариант не проходит :(
Код :

#!/usr/bin/python
#-*-encoding:UTF-8-*-

import socket

try:
sock = socket.create_connection(("www.google.com.ua", 80)) #Хост не важен
sock.send("""GET / HTTP/1.1\r\n
User-Agent: Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.5.22 Version/10.51\r\n
Host: www.google.com.ua\r\n
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\n
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8\r\n
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\n
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0\r\n
Cookie: PREF=ID=6157b92ce8fd499a:U=e51accf91bba456d:TM=1269161028:LM=1271000199:S=WuvNldjL6SRWBXju; NID=33=xWjV9B124AHy6KQNlrJ_w4Yvk6ctoo-bny7vRvFozxzzgbLiPg0pSMw_UFOlSSQ86T2n9S87Oew7PW-3pKE4ZppALSlMaWHVE8cspGS7Xtm81UhZ1qdoY8QXyhCZSRZC\r\n
Cookie2: $Version=1\r\n
Connection: Keep-Alive\r\n\r\n""")#Запрос в принципе тоже
a = sock.recv(12)
sock.close()
print a
except Exception, e:
print e
то что отловлено через wireshark:
GET / HTTP/1.1


User-Agent: Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.5.22 Version/10.51


Host: www.google.com.ua


Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1


Accept-Language: ru-RU,ru;q=0.9,en;q=0.8


Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1


Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0


Cookie: PREF=ID=6157b92ce8fd499a:U=e51accf91bba456d:TM=1269161028:LM=1271000199:S=WuvNldjL6SRWBXju; NID=33=xWjV9B124AHy6KQNlrJ_w4Yvk6ctoo-bny7vRvFozxzzgbLiPg0pSMw_UFOlSSQ86T2n9S87Oew7PW-3pKE4ZppALSlMaWHVE8cspGS7Xtm81UhZ1qdoY8QXyhCZSRZC


Cookie2: $Version=1


Connection: Keep-Alive



HTTP/1.1 302 Found

Location: http://www.google.com.ua/

Cache-Control: private

Content-Type: text/html; charset=UTF-8

Set-Cookie: PREF=ID=943232a91d5fab40:TM=1271529971:LM=1271529971:S=7f9AVyR0DM-pZK4X; expires=Mon, 16-Apr-2012 18:46:11 GMT; path=/; domain=.google.com

Set-Cookie: NID=33=MX6_P_RGDEfw86zwVrQ499K1lf74zl9vpFkxoDlutSm6IHqpXdiiUbLUqBE7DB7sIud-TWA08-xZtojhcnXEAApuz-jWEp7k2hSqBN1wvYoVjXb8n4QyHKMXD4sEUvo2; expires=Sun, 17-Oct-2010 18:46:11 GMT; path=/; domain=.google.com; HttpOnly

Date: Sat, 17 Apr 2010 18:46:11 GMT

Server: gws

Content-Length: 222



<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.com.ua/">here</A>.

</BODY></HTML>

HTTP/1.0 400 Bad Request

Content-Type: text/html; charset=UTF-8

Content-Length: 1350

Date: Sat, 17 Apr 2010 18:46:11 GMT

Server: GFE/2.0





<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>400 Bad Request</title>
<style><!--
body {font-family: arial,sans-serif}
div.nav {margin-top: 1ex}
div.nav A {font-size: 10pt; font-family: arial,sans-serif}
span.nav {font-size: 10pt; font-family: arial,sans-serif; font-weight: bold}
div.nav A,span.big {font-size: 12pt; color: #0000cc}
div.nav A {font-size: 10pt; color: black}
A.l:link {color: #6f6f6f}
A.u:link {color: green}
//--></style>
<script><!--
var rc=400;
//-->
</script>
</head>
<body text=#000000 bgcolor=#ffffff>
<table border=0 cellpadding=2 cellspacing=0 width=100%><tr><td rowspan=3 width=1% nowrap>
<b><font face=times color=#0039b6 size=10>G</font><font face=times color=#c41200 size=10>o</font><font face=times color=#f3c518 size=10>o</font><font face=times color=#0039b6 size=10>g</font><font face=times color=#30a72f size=10>l</font><font face=times color=#c41200 size=10>e</font>&nbsp;&nbsp;</b>
<td>&nbsp;</td></tr>
<tr><td bgcolor="#3366cc"><font face=arial,sans-serif color="#ffffff"><b>Error</b></td></tr>
<tr><td>&nbsp;</td></tr></table>
<blockquote>
<H1>Bad Request</H1>
Your client has issued a malformed or illegal request.

<p>
</blockquote>
<table width=100% cellpadding=0 cellspacing=0><tr><td bgcolor="#3366cc"><img alt="" width=1 height=4></td></tr></table>
</body></html>
Как видите, проходит не 12 байт, а много больше :(.
P.S. Если это что-то меняет, то Python - Stackless …



Офлайн

#4 Апрель 18, 2010 10:52:40

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

TCP/IP MTU HTTP Как получить один пакет ?

Ну используйте вместо GET - HEAD. Получите только заголовки.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#5 Апрель 18, 2010 10:56:41

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

TCP/IP MTU HTTP Как получить один пакет ?

diam123
Как видите, проходит не 12 байт, а много больше :(.
входящий пакет начинается с “HTTP/1.1 302 Found”, так что в данном случае 12 байт достаточно

Офлайн

#6 Апрель 18, 2010 10:58:23

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

TCP/IP MTU HTTP Как получить один пакет ?

кстате тут 2 входящих ответа от сервера

Офлайн

#7 Апрель 18, 2010 20:16:35

diam123
От:
Зарегистрирован: 2008-10-23
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

TCP/IP MTU HTTP Как получить один пакет ?

PooH
Ну используйте вместо GET - HEAD. Получите только заголовки.
Насколько мне известно, HEAD запросы некорректно обрабатываются большинством веб-серверов и на запрос HEAD веб-сервер реагирует как на GET.
o7412369815963
входящий пакет начинается с “HTTP/1.1 302 Found”, так что в данном случае 12 байт достаточно
Прочитать их - да, это не проблема. Проблема в том, как именно получить только их, без остального мусора, который приходит в комплекте )))
o7412369815963
кстате тут 2 входящих ответа от сервера
Тоже заметил, походу гугл после редиректа не ожидает повторного запроса на получение страницы по этому редиректу, а сразу отдает страницу, на которую происходит редирект. Код видели сами - я повторного запроса не делал )).
Ладно, вопрос в принципе закрываем - забью я на это дело наверное :(



Отредактировано (Апрель 18, 2010 20:19:43)

Офлайн

#8 Апрель 19, 2010 07:06:31

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

TCP/IP MTU HTTP Как получить один пакет ?

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

а вот исходник, все нормально работает.
# coding: utf-8

import socket

HOST = 'google.com'
PORT = 80
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send('GET /\r\n\r\n')
data = s.recv(12)
s.close()
print repr(data)
результат:
'HTTP/1.0 302'
diam123
я повторного запроса не делал ))
спорный вопрос

Офлайн

#9 Апрель 19, 2010 08:24:22

diam123
От:
Зарегистрирован: 2008-10-23
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

TCP/IP MTU HTTP Как получить один пакет ?

o7412369815963
а вот исходник, все нормально работает.
Вы не на то смотрите ) Я программно тоже получаю только первых 12 байт, с этой стороны все нормально.
Вот только проблема в том, что ФАКТИЧЕСКИ на сокет приходит обьем данных, гораздо больший чем 12 байт.
Я это проверяю через Wireshark.
т.е. То, что я программно увидел только 12 байт еще не означает, что ко мне попали именно 12 байт, а не больше.

o7412369815963
спорный вопрос
Код я приводил выше, мне нету смысла играть с Вами в загадки.



Офлайн

#10 Апрель 19, 2010 08:30:21

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

TCP/IP MTU HTTP Как получить один пакет ?

А что вы этим добиться то хотите? Сервер вам на запрос все равно вывалит все содержимое. Только получать вы его будете дольше, потому как порезано будет на мелкие кусочки. Ну и где нибудь на роутере хорошо память под буфер съедите.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version