Всем привет, меня интересует такой вопрос. Возможно ли на С++ написать авторизатор для Онлайн игр используя ВинСокеты. Тоесть Код отправляющий запрос я написал, даже запрос вроде как... Просто если брать для сравнения, то установив программу HTTp Analyzator и в нем есть утилита для создания запросов. Так вот выловив запрос от ИЕ когда происходит авторизация такой же запрос я посылаю через СОкет. Но тут такая ситуация, если запускать это запрос через ту Утилиту то в итоге я и получаю авторизированую страничку ну только с надписью "Ваш броузер не поддерживает фреймы" но страничка та что нужно, если же запускаю прогу с сокетами то получаю тот же результат за исключением того что не приходит код странички(размер = 0 ). Непойму почему. И еще интерисует, как сохранять куки и использовать их дальше при следующих действиях программы. Спасибо.
к сожалению не знаю как там в cpp, но в c# есть два замечательных класса для таких целей = HttpWebRequest/HttpWebRespone. По логике они стоят на ступеньку выше чем сокеты -- поэтому логичнее их юзать, а не сокеты. Плюс сюда же: при коннекте надо минимальную инфу передавать (user agent хотя бы), ну и конечно же из респонза вытаскивать кукисы
Ну это само собой я посылаю полноценный запрос, но если через Утилиту все работает но пишет что Броузер не поддерживает фреймы - само собой я ж не через броузер посылаю запрос. Через прогу же оно не принимает код странички. Потом в этой игре Куки работают пока не закрыл пагу поэтому когда первый раз словил куки нужно не обрывать связь а ВинСок как мне извесно прекращают свою деятельность)) ПОэтому надо их зациклить или еще что чтобы связь не обрывалась или Асинхроные сокеты юзать(но с ними я еще не знаком). Не поможешь?)) Вот то что у меня есть, ну тут все в коментах, это тестовая версия без редактирования. Code: #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[630]= { "POST /member.php HTTP/1.1\r\n" "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-icq, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-acclaim-launcherv1, */*\r\n" "Referer: http://haddan.ru/\r\n" "Cookie: PHPSESSID=u1rh2nr6aak9t4kaiepvv41d17\r\n" "Accept-Language: ru\r\n" "Content-Type: application/x-www-form-urlencoded\r\n" "UA-CPU: x86\r\n" "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\r\n" "Host: haddan.ru\r\n" "Connection: Keep-Alive\r\n" "Pragma: no-cache\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; }