PDA

Просмотр полной версии : Антикапча [Delphi]


GlooK
30.10.2009, 09:07
Возникла проблемка при реализации антикапчи...
Не знаю в каком типе переменной хранить мусор пикчи :).

Использую такую фанкшин:

function fWSRecv(wHost, wRequest: string):string;
var
wsData: TWSAData;
hHost: PHostEnt;
hAddr: TSockAddrIn;
hTimeout: TTimeVal;
iRead: integer;
hData: string;
hBuffer: array[0..buffsize] of char;
begin
WSAStartup($202, wsData);
hSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
hHost := gethostbyname(PChar(wHost));
hAddr.sin_family := AF_INET;
hAddr.sin_port := htons(80);
hAddr.sin_addr := pinaddr(hHost^.h_addr^)^;
hTimeout.tv_usec := 0;
hTimeout.tv_sec := mstimeout;
setsockopt(hSocket, SOL_SOCKET, SO_RCVTIMEO, @hTimeout, sizeof(ttimeval));
connect(hSocket, hAddr, SizeOf(hAddr));
hData := '';
Send(hSocket, wRequest[1], length(wRequest), 0);
while (TRUE) do
begin
FillChar(hBuffer, SizeOf(hBuffer), 0);
iRead := Recv(hSocket, hBuffer, length(hBuffer), 0);
hData := hData + copy(hBuffer, 0, iRead);
if (iRead <= 0) then break;
end;
CloseSocket(hSocket);
WSACleanup;
result := hData;
end;

Она естественно не подходит под пикчи, т.к. возвращает string, а в ней теряется мусор, т.к. он содержит нуль символы.
Какой тип данных использовать в result?

P.S. Со стрингами я работал через strpos, delete, copy.
Нужно чтобы их тоже можно было юзать или укажите аналогичные замены.

На antigate.com пример смотрел.
IdMultipartFormData - в своей лайт версии delphi не обнаружил.
Да и не люблю я инди...

Вообще то странно, что нет единой темы про антикапчу. Или я криво смотрел...

slesh
30.10.2009, 10:15
как вариант, выделяй память, туда закидывай данные и возвращай указатель на эту память. А там уже как угодно можешь юзать эту память, главное потом не забыть прибить её

0rs
30.10.2009, 10:33
Вроде в string нуль символы не должны теряться потому что строка не завершается нуль символом, а перед ней указывается длина. Кроме того в hData будет не только картинка, но и заголовок ответа сервера. А length(hBuffer) случайно не 0?
А вообще я выкладывал пример на дельфи для антикапчи http://forum.antichat.ru/thread151622.html, правда там используется сторонняя dll.

GlooK
30.10.2009, 16:41
как вариант, выделяй память, туда закидывай данные и возвращай указатель на эту память. А там уже как угодно можешь юзать эту память, главное потом не забыть прибить её

Составил в блокноте... куча ошибок наверное. Боюсь проверять даже на валидность :)

type
BArray := array[0..buffsize] of char;
var
hBuffer: ^BArray;
numcap: integer = 1;

function fWSRecv(wHost, wRequest: string):pointer;
var
wsData: TWSAData;
hHost: PHostEnt;
hAddr: TSockAddrIn;
hTimeout: TTimeVal;
iRead: integer;
hData: string;
begin
WSAStartup($202, wsData);
hSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
hHost := gethostbyname(PChar(wHost));
hAddr.sin_family := AF_INET;
hAddr.sin_port := htons(80);
hAddr.sin_addr := pinaddr(hHost^.h_addr^)^;
hTimeout.tv_usec := 0;
hTimeout.tv_sec := mstimeout;
setsockopt(hSocket, SOL_SOCKET, SO_RCVTIMEO, @hTimeout, sizeof(ttimeval));
connect(hSocket, hAddr, SizeOf(hAddr));
hData := '';
Send(hSocket, wRequest[1], length(wRequest), 0);
GetMem(hBuffer, numcap * SizeOf(hBuffer));
FillChar(hBuffer, SizeOf(hBuffer), 0);
while (TRUE) do
begin
iRead := Recv(hSocket, hBuffer[numcap]^, length(hBuffer), 0);
ReallocMem(hBuffer, numcap * SizeOf(hBuffer));
inc(numcap);
if (iRead <= 0) then break;
end;
CloseSocket(hSocket);
WSACleanup;
result := hBuffer;
FreeMem(hBuffer);
end;

Похоже на правду?

А length(hBuffer) случайно не 0? А вообще я выкладывал пример на дельфи для антикапчи http://forum.antichat.ru/thread151622.html, правда там используется сторонняя dll.
Лучше SizeOf использовать?
Пример, кста, полезный... спс.