Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Неполучается загрузить капчу (https://forum.antichat.xyz/showthread.php?t=162989)

_nic 12.12.2009 18:30

Неполучается загрузить капчу
 
Вот отрывок кода
Код:

....................................................................
          rec=0;acum=0;
          for(;;)
          {
                        rec=recv(s,Sr,1024*1024,0);
                        Sr+=rec;
                        acum=acum+rec;
                        if(rec==0){Sr-=acum;break;}
          }
          closesocket(s);
          alen=(strlen(Sr)-strlen(strstr(Sr,"\r\n\r\n")))+4;
          Sr+=alen;//обрезка заголовка
          Graphics::TBitmap * Bitmap = new Graphics::TBitmap;
          TJPEGImage * examp = new TJPEGImage;
          TMemoryStream *stM = new TMemoryStream;
          br=acum-alen;//размер картинки
          memcpy(img,Sr,br);//картинка копируется в буффер
          stM->Position=0;
          stM->Write((const void*)img,br);//в поток
          examp->LoadFromStream(stM);//а тут ошибка 42
          Bitmap->Assign(examp);
          PaintBox1->Canvas->Draw(59,59,Bitmap);
          delete examp;
          delete Bitmap;
          delete stM;
          Sr-=alen;
....................................................................

Conten-Length нету в content type image\jpeg
Скачаный и "очищенный" от заголовка файл начинается :
Цитата:

6c9
яШяа JFIF
Но всеравно компонента ругается 42й ошибкой =/


Путем метода тыка через сниффер оказалось что в моем коде размер картинки расчитывается на 12 байт больше чем показывает сниффер...Откудого они могут быть?И в какую часть файла попадают?

sn0w 12.12.2009 19:16

Код:

LPVOID Inet_GET(IN LPSTR host, IN LPSTR request, IN LPSTR referrer,OUT LPDWORD retlen, IN BOOL KeepConnection)
{
        LPCSTR szAccept[] = {"*/*", NULL};
        LPCSTR szUserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3";

        *retlen = 0;

        HINTERNET hInternet = InternetOpen(szUserAgent, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL,0);
       
        DWORD flags = INTERNET_FLAG_RELOAD | INTERNET_FLAG_PRAGMA_NOCACHE;
        if(KeepConnection) flags |= INTERNET_FLAG_KEEP_CONNECTION;
        HINTERNET hConnect = InternetConnect(hInternet, host, 80, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
        HINTERNET hRequest = HttpOpenRequest(hConnect, "GET", request, NULL, referrer, szAccept, flags, 0);

        HttpSendRequest(hRequest, 0, 0, NULL, 0);
       
        LPVOID        outbuff = halloc(4096);
        LPVOID        p = outbuff;

        DWORD size = 0, curr = 0;

        while(InternetReadFile(hRequest, p, 4096, &curr)==TRUE && curr !=0){
                size += curr;
                outbuff = hrealloc(outbuff, size + 4096);
                p = (LPVOID)((DWORD)outbuff+size);
        }

        InternetCloseHandle(hRequest);
        InternetCloseHandle(hConnect);
        InternetCloseHandle(hInternet);

        *retlen = size;
        return outbuff;
}
//////////////////////////////////////////////////////////////////////////
LPVOID Get_Image(char *url, DWORD *len, char *referrer)
{
        return Inet_GET("pix01.devki.ws", url, referrer, len, 0);
}


_nic 12.12.2009 19:21

У меня сокеты...Хотелось бы понять где косяк.

sn0w 12.12.2009 19:27

попробуй сканить до яШя (FF D8 FF) - просто смысла не втжу сокет юзать для этого. хотя смотря какое тз

sn0w 12.12.2009 19:28

у тяж указатель буфера нигде не декрементится, значит и получаешь то что есть, хотя борланд-борланд)

ааа хахах, вот в этом и задница в -= )

смотри с декрементом, тут твой косяк и лежит

_nic 12.12.2009 19:42

Насколько же ещё кроме заголовка нада буфер сдвинуть???

sn0w 12.12.2009 20:09

капча не может быть больше метра точно, поэтому получай рекв 1 раз а не в цикле, далее сканируй буфер (бинарно а не стрстрами) до появления последовательности яШя и будет тебе радость и минус куча кода

__mad 12.12.2009 20:13

Код:

6c9
яШяа JFIF

Когда заголовок не указан, то размер данных передается сразу вначале блока данных, то есть 6c9 (в хексе) в твоем случае и есть размер картинки, а после этого числа и переноса строки идут сами данные.

_nic 12.12.2009 20:34

Гм а чем заменить atoi для hex числа?

sn0w 12.12.2009 20:44

аналогично

//add
unsigned int mystrlen(char *sstring)
{
char *start = sstring;
while(*sstring++)
;
return (unsigned int)(sstring-start-1);
}

unsigned int BinToDec(char *sStr)
{

// 1 0 1 0 1 1 0 0 (BIN)
// 7 6 5 4 3 2 1 0 (offset)

unsigned int total = 0;
int nOff = 0;
for(int i = mystrlen(sStr)-1; i >= 0; i--){
if(sStr[i]=='1'){
total += pow(2, nOff)*1;
} // иначе домнаживаем на ноль
nOff++;
}
return total;
}

а каком формате то, приведи пример строки с хекс числом


Время: 05:46