Неполучается загрузить капчу

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _nic, 12 Dec 2009.

  1. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Вот отрывок кода
    Code:
    ....................................................................
    	   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
    Скачаный и "очищенный" от заголовка файл начинается :
    Но всеравно компонента ругается 42й ошибкой =/


    Путем метода тыка через сниффер оказалось что в моем коде размер картинки расчитывается на 12 байт больше чем показывает сниффер...Откудого они могут быть?И в какую часть файла попадают?
     
    #1 _nic, 12 Dec 2009
    Last edited: 12 Dec 2009
  2. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,031
    Likes Received:
    1,319
    Reputations:
    327
    Code:
    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);
    }
     
  3. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    У меня сокеты...Хотелось бы понять где косяк.
     
  4. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,031
    Likes Received:
    1,319
    Reputations:
    327
    попробуй сканить до яШя (FF D8 FF) - просто смысла не втжу сокет юзать для этого. хотя смотря какое тз
     
  5. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,031
    Likes Received:
    1,319
    Reputations:
    327
    у тяж указатель буфера нигде не декрементится, значит и получаешь то что есть, хотя борланд-борланд)

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

    смотри с декрементом, тут твой косяк и лежит
     
    #5 sn0w, 12 Dec 2009
    Last edited: 12 Dec 2009
  6. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Насколько же ещё кроме заголовка нада буфер сдвинуть???
     
  7. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,031
    Likes Received:
    1,319
    Reputations:
    327
    капча не может быть больше метра точно, поэтому получай рекв 1 раз а не в цикле, далее сканируй буфер (бинарно а не стрстрами) до появления последовательности яШя и будет тебе радость и минус куча кода
     
  8. __mad

    __mad Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    100
    Likes Received:
    38
    Reputations:
    7
    Code:
    6c9
    яШяа JFIF
    
    Когда заголовок не указан, то размер данных передается сразу вначале блока данных, то есть 6c9 (в хексе) в твоем случае и есть размер картинки, а после этого числа и переноса строки идут сами данные.
     
  9. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Гм а чем заменить atoi для hex числа?
     
  10. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,031
    Likes Received:
    1,319
    Reputations:
    327
    аналогично

    //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=='1'){
    total += pow(2, nOff)*1;
    } // иначе домнаживаем на ноль
    nOff++;
    }
    return total;
    }

    а каком формате то, приведи пример строки с хекс числом
     
    #10 sn0w, 12 Dec 2009
    Last edited: 12 Dec 2009
  11. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Да уже нашол нужную ф-цию _http://devpinoy.org/blogs/cvega/archive/2006/06/19/xtoi-hex-to-integer-c-function.aspx
    Теперь проблема уже в борланде всеравно плюет той же самой 42й ошибкой хотя уже на диске оказывается полдноценная картинка
    Code:
    	   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;
    	   strncat(imgS,Sr,3);
    	   xtoi(imgS,&br);
    	   Sr+=5;
    	   memcpy(img,Sr,br);
    	   HANDLE f=CreateFile("D:\\damp.jpeg",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_FLAG_RANDOM_ACCESS,NULL);
    	   DWORD wb;
    	   WriteFile(f,img,br,&wb,0);
    	   CloseHandle(f);
    	   //stM->Position=0;
    	   stM->Write((const void*)img,br);
    	   examp->LoadFromStream(stM);
    	   Bitmap->Assign(examp);
    	   PaintBox1->Canvas->Draw(59,59,Bitmap); 
    	   delete examp;
    	   delete Bitmap;
    	   delete stM;
    	   Sr-=alen;
    	   Sr-=5;