Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Работа с HTTP через WinSock2

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Работа с HTTP через WinSock2
Имя
Сообщение << Старые топики   Новые топики >>
Работа с HTTP через WinSock2 - 2010-05-13 19:36:07.013333   
furiousangel

Сообщений: 1116
Оценки: 0
Присоединился: 2005-05-28 06:31:47
Здравствуйте!
Столкнулся с такой вот проблемой. Есть вебсервер. Надо написать простенькую программу, которая например будет с периодичностью в 10-20 секунд отправлять запрос на сервер. В принципе как это все делать я знаю. Но не работает[:(]
Точнее работает, но не так, как хотелось бы. Дело в том, что шлется HTTP-запрос, сервер отдает ответ. Потом через 10 секунд шлется еще один такой же запрос, но сервер в ответ молчит. И в чем беда не могу понять. Была первая мысль, что надо во втором передать серверу куки, которые он отдал в ответ на первый запрос. Проверил. Отключил прием кукисов и сессии в браузере, но браузер справно отдавал код страницы. Посему я в растерянности.
Теперь опишу что да как я делал. Перехватил пакет, который шлется веб-серверу и закодил его в программму. Вот сам код (слабонервных прошу не смотреть. я сам не в восторге от своего стиля программирования[&:]). Здесь не весь код. Все что до этого имхо можно опустить. сокет нормально создается. конект тоже нормально проходит. и первый ответ.
quote:


char&nbsp; SendPacket(struct packet pack)
{

&nbsp;&nbsp;&nbsp; char req[4096] = {0};
&nbsp;&nbsp;&nbsp; char res[4096] = {0};
&nbsp;&nbsp;&nbsp; int nsize;
&nbsp;&nbsp;&nbsp; strcpy_s(req,"POST ");
&nbsp;&nbsp;&nbsp; strcat_s(req, *pack.uri);
&nbsp;&nbsp;&nbsp; strcat_s(req, *pack.id);
&nbsp;&nbsp;&nbsp; strcat_s(req," HTTP/1.1\r\n");
&nbsp;&nbsp;&nbsp; strcat_s(req,"Host: ");
&nbsp;&nbsp;&nbsp; strcat_s(req,*pack.host);
&nbsp;&nbsp;&nbsp; strcat_s(req,"\r\nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3\r\n");
&nbsp;&nbsp;&nbsp; strcat_s(req, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n");
&nbsp;&nbsp;&nbsp; strcat_s(req, "Accept-Language: ru,en-us;q=0.7,en;q=0.3\r\n");
&nbsp;&nbsp;&nbsp; strcat_s(req, "Accept-Encoding: gzip,deflate\r\n");
&nbsp;&nbsp;&nbsp; strcat_s(req, "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\n");
&nbsp;&nbsp;&nbsp; strcat_s(req, "Keep-Alive: 115");
&nbsp;&nbsp;&nbsp; strcat_s(req, "\r\n\r\n");
&nbsp;&nbsp;&nbsp; #ifdef _DEBUG
&nbsp;&nbsp;&nbsp; //MessageBoxA(0,req,"Sending",NULL);
&nbsp;&nbsp;&nbsp; fprintf(f,"Good: Sending…\r\n%s",req);
&nbsp;&nbsp;&nbsp; #endif
&nbsp;&nbsp;&nbsp; if (send(sock,req,sizeof(req)-1,0)==SOCKET_ERROR)
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //MessageBoxA(0,"Error sending to server","Err",0);
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; #ifdef _DEBUG
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fprintf(f,"Error: Failed sending to server");
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; #endif
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return FALSE;
&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; do
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; nsize = recv(sock,res,sizeof(res)-1,0);
&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; while(nsize&gt;0);
&nbsp;&nbsp;&nbsp; #ifdef _DEBUG
&nbsp;&nbsp;&nbsp; //MessageBoxA(0,res,"GET",0);
&nbsp;&nbsp;&nbsp; fprintf(f,"Good: Getting …\r\n%s\r\n",res);
&nbsp;&nbsp;&nbsp; #endif
&nbsp;&nbsp;&nbsp; return res[4096];
}


а вот что вылазит в логе
quote:


Good: host = 10.8.0.1

Good: socket = 232

Good: Sending…

POST / HTTP/1.1

Host: 10.8.0.1

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: ru,en-us;q=0.7,en;q=0.3

Accept-Encoding: gzip,deflate

Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7

Keep-Alive: 115



Good: Getting …

HTTP/1.1 200 OK

Date: Thu, 13 May 2010 14:35:24 GMT

Server: Apache/2.2.4 (Win32) mod_ssl/2.2.4 OpenSSL/0.9.8k PHP/5.2.12

X-Powered-By: PHP/5.2.12

Set-Cookie: ci_session=a%3A4%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%22e8b512e011c226f1e7dba94abedd0ad6%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A8%3A%2210.8.0.6%22%3Bs%3A10%3A%22user_agent%22%3Bs%3A50%3A%22Mozilla%2F5.0+%28Windows%3B+U%3B+Windows+NT+5.1%3B+ru%3B+rv%3A1.%22%3Bs%3A13%3A%22last_activity%22%3Bs%3A10%3A%221273761324%22%3B%7D05b1710aaf72c7b2093df4f2a78859e4; expires=Thu, 13-May-2010 16:35:24 GMT; path=/

Content-Length: 4

Content-Type: text/html; charset=utf8



fuck

Good: host = 10.8.0.1

Good: socket = 232

Good: Sending…

POST / HTTP/1.1

Host: 10.8.0.1

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: ru,en-us;q=0.7,en;q=0.3

Accept-Encoding: gzip,deflate

Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7

Keep-Alive: 115



Good: Getting …



Good: host = 10.8.0.1


Как видно ответ пустой. У кого есть здравые мысли по этому поводу очень прошу Вас поделиться ими.
Post #: 1
RE: Работа с HTTP через WinSock2 - 2010-05-13 20:57:16.670000   
lito777

Сообщений: 51
Оценки: 0
Присоединился: 2009-01-30 04:52:45.883333
Добавите в запрос
Connection: Keep-Alive
Post #: 2
RE: Работа с HTTP через WinSock2 - 2010-05-13 21:03:50.463333   
furiousangel

Сообщений: 1116
Оценки: 0
Присоединился: 2005-05-28 06:31:47
Добавил в конец. Но тщетно(((
Ситуация не изменилась - второй ответ не отправляется.
Post #: 3
RE: Работа с HTTP через WinSock2 - 2010-05-26 15:04:01.303333   
Kali0stro

Сообщений: 38
Оценки: 0
Присоединился: 2010-05-26 10:43:43.710000
насколько я понимаю принцип обмена данными клиента и сервера, все работает как и положено.
Поясню:
1) Вы отправляете серверу запрос на открытие сессии с удержанием (Keep-Alive).
2) Сервер честно создает сессию с удержанием о чем и рапортует.
3) Сервер ждет от Вас запрос страницы, а поскольку во втором запросе нет ссылки на страницу, сервер честно ничего не возвращает.
Предложение: либо убрать "Keep-Alive", либо запрашивать страницу (например заведомо отсутствующую, тогда будет ответ 404). Возможно сервер запросит cookes.

Я выделил цветом время создания и время закрытия сессии:
quote:

Good: Getting …

HTTP/1.1 200 OK

Date: Thu, 13 May 2010 14:35:24 GMT

Server: Apache/2.2.4 (Win32) mod_ssl/2.2.4 OpenSSL/0.9.8k PHP/5.2.12

X-Powered-By: PHP/5.2.12

Set-Cookie: ci_session=a%3A4%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%22e8b512e011c226f1e7dba94abedd0ad6%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A8%3A%2210.8.0.6%22%3Bs%3A10%3A%22user_agent%22%3Bs%3A50%3A%22Mozilla%2F5.0+%28Windows%3B+U%3B+Windows+NT+5.1%3B+ru%3B+rv%3A1.%22%3Bs%3A13%3A%22last_activity%22%3Bs%3A10%3A%221273761324%22%3B%7D05b1710aaf72c7b2093df4f2a78859e4; expires=Thu, 13-May-2010 16:35:24 GMT; path=/

Content-Length: 4

Content-Type: text/html; charset=utf8


Сервер будет держать соединение 2 часа вне зависимости от того, хотите Вы с ним дальше общаться или нет… ;)
Post #: 4
RE: Работа с HTTP через WinSock2 - 2010-05-26 23:38:41.236666   
furiousangel

Сообщений: 1116
Оценки: 0
Присоединился: 2005-05-28 06:31:47
Эм. Ну ссылка то есть
POST / HTTP/1.1  - корень
А убрать Keep-Alive пробовал. Не помогает.
Post #: 5
RE: Работа с HTTP через WinSock2 - 2010-05-27 06:38:56.923333   
Kali0stro

Сообщений: 38
Оценки: 0
Присоединился: 2010-05-26 10:43:43.710000
Метод POST предназначен для отправки данных web-форм на сервер (http://ru.wikipedia.org/wiki/HTTP#POST), а вы ничего не отсылаете.
Попробуйте использовать "GET / HTTP/1.1" или "HEAD / HTTP/1.1".
Post #: 6
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Работа с HTTP через WinSock2







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.