ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Антикапча [Delphi]
  #1  
Старый 30.10.2009, 09:07
GlooK
Участник форума
Регистрация: 20.04.2007
Сообщений: 174
Провел на форуме:
2310282

Репутация: 149
По умолчанию Антикапча [Delphi]

Возникла проблемка при реализации антикапчи...
Не знаю в каком типе переменной хранить мусор пикчи .

Использую такую фанкшин:
Код:
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 не обнаружил.
Да и не люблю я инди...

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

  #2  
Старый 30.10.2009, 10:15
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

как вариант, выделяй память, туда закидывай данные и возвращай указатель на эту память. А там уже как угодно можешь юзать эту память, главное потом не забыть прибить её
 
Ответить с цитированием

  #3  
Старый 30.10.2009, 10:33
0rs
Познающий
Регистрация: 30.12.2008
Сообщений: 64
Провел на форуме:
647156

Репутация: 76
Отправить сообщение для 0rs с помощью ICQ
По умолчанию

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

Последний раз редактировалось 0rs; 30.10.2009 в 12:01..
 
Ответить с цитированием

  #4  
Старый 30.10.2009, 16:41
GlooK
Участник форума
Регистрация: 20.04.2007
Сообщений: 174
Провел на форуме:
2310282

Репутация: 149
По умолчанию

Цитата:
Сообщение от slesh  
как вариант, выделяй память, туда закидывай данные и возвращай указатель на эту память. А там уже как угодно можешь юзать эту память, главное потом не забыть прибить её
Составил в блокноте... куча ошибок наверное. Боюсь проверять даже на валидность
Код:
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 использовать?
Пример, кста, полезный... спс.
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хороший фейк Vkontakte нахаляву [delphi] ][yZ Социальные сети 25 17.03.2010 13:01
Узнать главный диск [Delphi] Sin3v С/С++, C#, Delphi, .NET, Asm 7 01.04.2009 11:46
[Delphi] помогите достать исходники ИИ mrVoodoo С/С++, C#, Delphi, .NET, Asm 1 13.02.2009 20:55



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ