Работа с HTTP через WinSock2
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Работа с HTTP через WinSock2 - 2010-05-13 19:36:07.013333
|
|
|
furiousangel
Сообщений: 1116
Оценки: 0
Присоединился: 2005-05-28 06:31:47
|
Здравствуйте! Столкнулся с такой вот проблемой. Есть вебсервер. Надо написать простенькую программу, которая например будет с периодичностью в 10-20 секунд отправлять запрос на сервер. В принципе как это все делать я знаю. Но не работает[:(] Точнее работает, но не так, как хотелось бы. Дело в том, что шлется HTTP-запрос, сервер отдает ответ. Потом через 10 секунд шлется еще один такой же запрос, но сервер в ответ молчит. И в чем беда не могу понять. Была первая мысль, что надо во втором передать серверу куки, которые он отдал в ответ на первый запрос. Проверил. Отключил прием кукисов и сессии в браузере, но браузер справно отдавал код страницы. Посему я в растерянности. Теперь опишу что да как я делал. Перехватил пакет, который шлется веб-серверу и закодил его в программму. Вот сам код (слабонервных прошу не смотреть. я сам не в восторге от своего стиля программирования[&:]). Здесь не весь код. Все что до этого имхо можно опустить. сокет нормально создается. конект тоже нормально проходит. и первый ответ. quote:
char SendPacket(struct packet pack) { char req[4096] = {0}; char res[4096] = {0}; int nsize; strcpy_s(req,"POST "); strcat_s(req, *pack.uri); strcat_s(req, *pack.id); strcat_s(req," HTTP/1.1\r\n"); strcat_s(req,"Host: "); strcat_s(req,*pack.host); 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"); strcat_s(req, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"); strcat_s(req, "Accept-Language: ru,en-us;q=0.7,en;q=0.3\r\n"); strcat_s(req, "Accept-Encoding: gzip,deflate\r\n"); strcat_s(req, "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\n"); strcat_s(req, "Keep-Alive: 115"); strcat_s(req, "\r\n\r\n"); #ifdef _DEBUG //MessageBoxA(0,req,"Sending",NULL); fprintf(f,"Good: Sending…\r\n%s",req); #endif if (send(sock,req,sizeof(req)-1,0)==SOCKET_ERROR) { //MessageBoxA(0,"Error sending to server","Err",0); #ifdef _DEBUG fprintf(f,"Error: Failed sending to server"); #endif return FALSE; } do { nsize = recv(sock,res,sizeof(res)-1,0); } while(nsize>0); #ifdef _DEBUG //MessageBoxA(0,res,"GET",0); fprintf(f,"Good: Getting …\r\n%s\r\n",res); #endif 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 Как видно ответ пустой. У кого есть здравые мысли по этому поводу очень прошу Вас поделиться ими.
|
|
|
RE: Работа с HTTP через WinSock2 - 2010-05-13 20:57:16.670000
|
|
|
lito777
Сообщений: 51
Оценки: 0
Присоединился: 2009-01-30 04:52:45.883333
|
Добавите в запрос Connection: Keep-Alive
|
|
|
RE: Работа с HTTP через WinSock2 - 2010-05-13 21:03:50.463333
|
|
|
furiousangel
Сообщений: 1116
Оценки: 0
Присоединился: 2005-05-28 06:31:47
|
Добавил в конец. Но тщетно((( Ситуация не изменилась - второй ответ не отправляется.
|
|
|
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 часа вне зависимости от того, хотите Вы с ним дальше общаться или нет… ;)
|
|
|
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 пробовал. Не помогает.
|
|
|
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".
|
|
|
|
|