Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2011, 09:20   #1
Armatus
Форумчанин
 
Регистрация: 09.05.2009
Сообщений: 122
По умолчанию Winsock и http

Товарищи программисты. Возник насущный вопрос. Как корректно наладить общение с веб сервером через Winsock. Используем язык программирования с++ и среду разработки Embercadero C++ Builder 2010.
Выкладываю код который успешно выполняет подключение по порту 80 и IP. Хотел выяснить как корректно передать HTTP запрос серверу. Буду весьма признателен за помощь.
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <winsock2.h>
#include <tchar.h>
#include <iostream.h>
#include  <conio.h>
#pragma argsused
//---------------------------------------------------------------------------

//-------------------------------Переменные----------------------------------
WSADATA wData;
struct sockaddr_in addr;
SOCKET sock;
char msg[1024];
//---------------------------------------------------------------------------

//-------------------------------Тело Программы----------------------------------
int main() //
{ if(WSAStartup(MAKEWORD(1,1),&wData)!=0)
	{
		return 1;

	}
		sock=socket(AF_INET,SOCK_STREAM,0);
	if(sock==-1)
	{
		return 2;
	}
	addr.sin_family=AF_INET;
	addr.sin_port=htons(80);
	addr.sin_addr.s_addr=inet_addr("192.168.0.223");
	if (connect(sock,(struct sockaddr *)&addr,sizeof(addr))!=0) {
	   return 3;
	}
	 gets(&msg[0]);
	 send(sock,&msg[0],sizeof(msg),0);
	 recv(sock,&msg[0],sizeof(msg),0);
	 printf(&msg[0]);
	 shutdown(sock,2);
	 closesocket(sock);
	 WSACleanup();
	 getch();
	return 0;
}
//---------------------------------------------------------------------------

Последний раз редактировалось Armatus; 21.03.2011 в 15:34.
Armatus вне форума Ответить с цитированием
Старый 21.03.2011, 15:38   #2
Armatus
Форумчанин
 
Регистрация: 09.05.2009
Сообщений: 122
По умолчанию

Так коннект победил(код в первом посте отредактировал), запросы шлет, но неккоретно. ответы получает. Вопрос насущный как корректно отослать запрос серверу? Хотелось бы увидеть пример простой.

Последний раз редактировалось Armatus; 21.03.2011 в 15:53.
Armatus вне форума Ответить с цитированием
Старый 21.03.2011, 17:00   #3
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Так в запросе должны быть символы перевода строки, а gets() их не вставит. типа того:

Код:
msg = 'GET / HTTP/1.0\r\n\User-Agent: CPPTest\r\n\Connection: close\r\n\r\n';
send(sock,&msg[0],sizeof(msg),0);
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 21.03.2011, 17:26   #4
Armatus
Форумчанин
 
Регистрация: 09.05.2009
Сообщений: 122
По умолчанию

Сработало. Тогда возник вопрос следующий. Задача заключается в программном заполнении формы которую мне выдал сервер. Код ответа и скрин формы из браузера прицепил ниже. Каким образом я могу заполнить форму в этом случае?

Цитата:
<html>
<head>
<title>login</title>
<meta http-equiv="Content-Type" content="text/html; charset=unicode">
<script type="text/javascript" src="../template/webagent.js"></script>
<link href="../template/webagent.css" rel="stylesheet" type="text/css">

<script language="JavaScript" type="text/JavaScript">
function MM_preloadImages() { //v3.0
var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
var i,j=d.MM_p.length,a=MM_preloadImage s.arguments; for(i=0; i<a.length; i++)
if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function login_init() {
var frm = document.login_wconf;

frm.login_id.focus();
}

function auto_submit()
{
var frm = document.login_wconf;

frm.submit();
}

function check_form()
{
var frm = document.login_wconf;

frm.submit();

}

</script>
</head>

<body bgcolor="FDFDFD" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" onload="login_init();">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td height="647" align="center" valign="top" background="../img/login_bg.gif"><table width="644" border="0" cellspacing="0" cellpadding="0">
<tr>
<td height="132" colspan="3">&nbsp;</td>
</tr>
<tr>
<td colspan="3" background="../img/login_top.gif" width="644" height="47" class="txt_bbbig">&nbsp;&nbsp;&nbsp ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp ;&nbsp;&nbsp;&nbsp;&nbsp;WEB LOGIN</td>
</tr>
<tr>
<td width="30"><img src="../img/login_left.gif" width="30" height="224"></td>
<td width="585" align="center" bgcolor="#FFFFFF"><table width="532" border="0" cellspacing="0" cellpadding="1">
<tr>
<td width="50" height="18" class="txt_bbig">LOGIN</td>
</tr>
<tr>
<td>&nbsp;</td>
</tr>
<tr>
<form name="login_wconf" method="post" action="./login_proc.cgi">
<input type=hidden name="login_type" value="0">
<td bgcolor="D9D9D9"><table width="532" border="0" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF">
<tr>
<td width="100" height="80" align="center"><img src="../img/login_img.gif" width="73" height="73"></td>
<td align="center">
<table width="350" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="120" height="22" class="se"><strong>USER ID</strong></td>
<td width="120" align="center"><input class="i_text01" name="login_id" type="text" size="15"></td>
<td width="110" rowspan="2" align="right"><input type="button" class="btn_login" onclick="auto_submit()" value="LOGIN"></td>
</tr>
<tr>
<td height="22" class="se"><strong>PASSWORD</strong></td>
<td align="center"><input class="i_text01" name="login_pwd" type="password" type="text" size="15" onKeyPress="if(event.keyCode == '13') check_form();"></td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</form>
</tr>
<tr>
<td>&nbsp;</td>
</tr>
<tr>
<td width="532" height="19" class="txt_big"><center>
Only authorized user is allowed to access to the web server<br> due to security reasons.</center>
</td>
</tr>
</table></td>
<td width="30"><img src="../img/login_right.gif" width="30" height="224"></td>
</tr>
<tr>
<td colspan="3"><img src="../img/login_bottom.gif" width="643" height="30"></td>
</tr>
</table></td>
</tr>
</table>
</body>
</html>

Последний раз редактировалось Armatus; 22.03.2011 в 08:32.
Armatus вне форума Ответить с цитированием
Старый 21.03.2011, 19:21   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

да ну, не хватало ещё голову над хтмл ломать.. возьмите вайршарк, перехватите, что там бравзер посылает и пошлите то же самое.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 22.03.2011, 08:59   #6
Armatus
Форумчанин
 
Регистрация: 09.05.2009
Сообщений: 122
По умолчанию


Похоже это то что мне нужно?
Armatus вне форума Ответить с цитированием
Старый 22.03.2011, 09:50   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

ага, похоже

ещё обрати внимание, там ниже сервер отвечает кодом 302, т.е. следующий запрос нужно будет посылать по новому адресу.

Есть ещё такая тонкость, что если ответ большой, одним recv() не обойдешься, нужно будет анализировать полученные данные.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 30.03.2011, 10:46   #8
Armatus
Форумчанин
 
Регистрация: 09.05.2009
Сообщений: 122
По умолчанию

Вот код программы:
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <winsock2.h>
#include <tchar.h>
#include <iostream.h>
#include  <conio.h>
#pragma argsused
//---------------------------------------------------------------------------

//-------------------------------Переменные----------------------------------
WSADATA wData;
struct sockaddr_in addr;
SOCKET sock;
char msg[10024];
char msg1[10024];
char s[46];
//---------------------------------------------------------------------------

//-------------------------------Тело Программы------------------------------
int main() //
{ if(WSAStartup(MAKEWORD(1,1),&wData)!=0)
	{
		return 1;

	}
		sock=socket(AF_INET,SOCK_STREAM,0);
	if(sock==-1)
	{
		return 2;
	}
	addr.sin_family=AF_INET;
	addr.sin_port=htons(80);
	addr.sin_addr.s_addr=inet_addr("192.168.0.223");
	if (connect(sock,(struct sockaddr *)&addr,sizeof(addr))!=0) {
	   return 3;
	}
	 sprintf(msg,"GET /cgi-bin/login.cgi HTTP/1.1\r\n\r\n");
	 send(sock,&msg[0],sizeof(msg),0);
	 recv(sock,&msg[0],sizeof(msg),0);
	 strncpy(s,&msg[139],46);
	 printf(&msg[0]);
	 //printf(&s[0]);
	 strcat(&msg1[0],"POST http://192.168.0.223/cgi-bin/login_proc.cgi HTTP/1.1\r\nAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*\r\nReferer: http://192.168.0.223/cgi-bin/login.cgi\r\nAccept-Language: ru\r\nContent-Type: application/x-www-form-urlencoded\r\nUA-CPU: x86\r\nAccept-Encoding: gzip, deflate\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)\r\nProxy-Connection: Keep-Alive\r\nContent-Length: 42\r\nHost: 192.168.0.223\r\nPragma: no-cache\r\nCookie: CGISID=");
	 strcat(&msg1[755],s);
	 strcat(&msg1[800],"\r\n\r\nlogin_type=0&login_id=admin&login_pwd=1234");
	 send(sock,&msg1[0],sizeof(msg),0);
	 recv(sock,&msg1[0],sizeof(msg),0);
	 printf(&msg1[0]);
	 shutdown(sock,2);
	 closesocket(sock);
	 WSACleanup();
	 getch();
	return 0;
}
//---------------------------------------------------------------------------
не получается отправить второй запрос на пост. Прилагаю логи Wireshark. В чем моя проблема?
http://ifolder.ru/22688324
Armatus вне форума Ответить с цитированием
Старый 04.04.2011, 13:41   #9
Armatus
Форумчанин
 
Регистрация: 09.05.2009
Сообщений: 122
По умолчанию

Есть у кого какие мысли?
Armatus вне форума Ответить с цитированием
Старый 04.04.2011, 20:32   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

всмысле не получается вылетает ошибка?
так правильно, сервер может закрыть ваше соединение ведь вы не сказали Connection: Keep-Alive(и не факт что сервер позволяет) чтоб слать в то же соединение второй запрос.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Winsock http-запросы SmartCream Работа с сетью в Delphi 5 14.03.2011 15:34
WinSock Onekey Обсуждение статей 0 20.08.2010 12:04
Http Proxy - как написать к браузеру http-прокси? SergeiGuk Общие вопросы .NET 0 21.05.2010 17:37
WinSock ImmortalAlexSan Работа с сетью в Delphi 1 11.05.2010 14:42
WinSock profi Win Api 8 11.01.2010 21:13