TGrey[WoLf]
Сообщений: 3
Оценки: 0
Присоединился: 2008-10-02 19:22:30.440000
|
Здаствуйте, решил вот узнать, что такое сокеты и что с ними делать. Пошарил по интернету нашел статей, почитал, создал код. Но вот теперь интересно стало, как отправить запрос через HHTP протокол. Я играл в одну игру браузерную и у меня там еще есть акк. Так вот мне интересно, как мне залогинится отправив данные через Сокет. Все мои попытки были неудачны. Вот сайт www.haddan.ru как я понимаю данные вводимые на главное страничке отправляются в другой файл, глде происходит их обработка. Специально для этого я скачал HTTP Analyzator и проследил, что, куда после нажатия кнопки ВОЙТИ. ПОлучил вот такой запрос quote:
POST /member.php HTTP/1.0 Host: www.haddan.ru User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.13) Gecko/20080311 AdCentriaIM/1.7 Firefox/2.0.0.13 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://www.haddan.ru/ Content-Type: application/x-www-form-urlencoded Content-Length: 33 username=USER&passwd=PASS далее если через ИЕ - логинится, если через фаерфокс - просит зайти в ИЕ. Всунул я это в код #include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>
#include <ctype.h>
#define PORT 80 // Порт, через который идет подключение к серверу....21,80,25,110 и т.п.
#define SERVERADDR "77.91.229.20" // Адрес сервера
int main ( int argc, char* argv [ ] )
{
WSADATA wd;
char buff[10000];
char buff2[9000]= {
"POST /member.php HTTP/1.0\r\n"
"Host: www.haddan.ru\r\n"
"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.13) Gecko/20080311 AdCentriaIM/1.7 Firefox/2.0.0.13\r\n"
"Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
"Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3\r\n"
"Accept-Encoding: gzip,deflate\r\n"
"Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\n"
"Keep-Alive: 300\r\n"
"Connection: keep-alive\r\n"
"Referer: http://www.haddan.ru/\r\n"
"Content-Type: application/x-www-form-urlencoded\r\n"
"Content-Length: 33\r\n\r\n"
"username=USER&passwd=PASS"
};
printf ( "TCP Client \n" ); // ну, тут и так понятно
if ( WSAStartup ( 0x202, &wd ) )
{
printf ( " WSAStart error %d \n ", WSAGetLastError ( ) );
return -1;
}
SOCKET sock ;
sock=socket ( AF_INET, SOCK_STREAM, 0 );
if ( sock < 0 )
{
printf (" Socket ( ) error %d \n ", WSAGetLastError ( ) );
return -1;
}
sockaddr_in dest_addr;
dest_addr.sin_family=AF_INET; //инет коннектинг
dest_addr.sin_port=htons ( PORT ); //порт
HOSTENT *hst; // хост
if( inet_addr(SERVERADDR) != INADDR_NONE )
dest_addr.sin_addr.S_un.S_addr = inet_addr(SERVERADDR);
else if( hst=gethostbyname ( SERVERADDR ) )
( ( unsigned long * ) &dest_addr.sin_addr )[0]=((unsigned long** )hst->h_addr_list)[0][0];
else
{
printf( "invalid address %s \n", SERVERADDR );
closesocket( sock ) ;
WSACleanup();
return -1;
}
if(connect( sock, (sockaddr *)&dest_addr, sizeof(dest_addr) ))
{
printf (" Connect error %d \n ", WSAGetLastError ( ) );
return -1;
}
//sprintf( buff2, "GET /room/func/mine.php HTTP/1.1\r\nHost: haddan.ru\r\nConnection: Close\r\n\r\n");
send( sock, buff2, sizeof(buff2), 0);
recv( sock, buff, sizeof(buff)-1, 0 );
//for(int i=0; i < strlen(buff); i++)
// if(isalnum(buff[i]) || buff[i] == '<'|| buff[i] == '>' || buff[i] == '/')
printf("%s",buff );
// else
// continue;
printf("\n");
printf ("Connection with %s succesfully. quit - quit" , SERVERADDR );
//int nsize;
/*while( ( nsize = recv( sock, buff, sizeof(buff)-1, 0 ) ) != SOCKET_ERROR )
{
buff[ nsize ] =0;
printf ( " S=>C: %s ", buff ) ;
printf ( "S<=C: " ) ;
fgets ( &buff [0], sizeof( buff )-1, stdin );
if ( !strcmp ( &buff[0], "quit\n" ) )
{
printf ( " Exit " );
closesocket ( sock ) ; //выход правильный
WSACleanup() ;
return 0;
}
send ( sock, &buff [ 0 ], nsize, 0 ) ;
}*/
//printf ( " Recv error %d \n", WSAGetLastError ( ) );
//closesocket ( sock ) ;
//WSACleanup ( ) ;
return 0;
}
В итоге получаю такой результат quote:
TCP Client HTTP/1.1 302 Found Date: Thu, 02 Oct 2008 15:40:08 GMT Server: Apache/2.0.58 (Unix) PHP/5.1.4 X-Powered-By: PHP/5.1.4 Set-Cookie: PHPSESSID=ct419tcu690bp9hmvq2b4dnt95; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache location: /main.php Content-Encoding: gzip Vary: Accept-Encoding Content-Length: 26 Keep-Alive: timeout=3, max=250 Connection: Keep-Alive Content-Type: text/html; charset=windows-1251 ▼Л Connection with 77.91.229.20 succesfully. quit - quitPress any key to continue И если просмотреть принятое содержимое через Анализатор то там quote:
‹ xњ яя HTTP/1.1 414 Request-URI Too Large Date: Thu, 02 Oct 2008 15:41:59 GMT Server: Apache/2.0.58 (Unix) PHP/5.1.4 Content-Length: 333 Connection: close Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>414 Request-URI Too Large</title> </head><bоdу> <h1>Request-URI Too Large</h1> <p>The requested URL's length exceeds the capacity limit for this server.<br /> </p> <hr> <address>Apache/2.0.58 (Unix) PHP/5.1.4 Server at haddan.ru Port 80</address> </bоdу> Меня смущает значение масива запроса(buff) - 9000, но если поставить меньше, то оно долго думает и нет никаких результатов. Тоесть кроме того, как показать как нужно построить запрос было бы не плохо может подкинуть литературы, где расписано, как, где и что. Вот такая фигня получается. Спасибо.
|