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

Delphi потоки вопрос по капчи
  #1  
Старый 13.03.2010, 06:06
Аватар для trigada
trigada
Banned
Регистрация: 23.09.2009
Сообщений: 5
Провел на форуме:
70690

Репутация: 0
По умолчанию Delphi потоки вопрос по капчи

Здраствуйте.
Такой вопрос:
Пытаюсь разобраться с написанием многопоточной программки, с помощью "Винсок". Потоки как бы сделал все норм. Мне нужно взять капчу и передавать ее на антигейт.ком, воспользовавшись
кодом который показал GlooK, в одной из тем, мне удалось вытащить капчу, но в том коде как бы капча вытаскиваеться в файл, насколько я понял, то так, как прога многопоточная, то не хорошо создавать файлы капчи для каждого потока, а потом удалять. Т.е. мне нужно капчу в память "пихать" и делать post запрос на антигейт, но я никак не могу понять, каким образом.
Вот код GlooKa чуть поправленный под мои требования:

Код:
function fWSRecv(wHost, wRequest, wPort: string ): integer;
var
hSocket: TSocket;
wsData: TWSAData;
hHost: PHostEnt;
hAddr: TSockAddrIn;
hTimeout: TTimeVal;
iRead: integer;
h : dword;
rb : dword;
hBuffer: array[0..MAX_BUF_LEN] of char;
NewFile: file;
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(strtoint(wPort));
 hAddr.sin_addr := pinaddr(hHost^.h_addr^)^;
 hTimeout.tv_usec := 0;
 hTimeout.tv_sec := (REPLY_TIMEOUT mod 1000) * 1000;;
 setsockopt(hSocket, SOL_SOCKET, SO_RCVTIMEO, @hTimeout, sizeof(ttimeval));
 connect(hSocket, hAddr, SizeOf(hAddr));
//Data := '';
 Send(hSocket, wRequest[1], length(wRequest), 0);
AssignFile(NewFile,'c:\capcha1.jpeg');
Rewrite(NewFile, 1);
 while (TRUE) do
 begin
  FillChar(hBuffer, SizeOf(hBuffer), 0);
  iRead := Recv(hSocket, hBuffer, length(hBuffer), 0);
     rb := pos(#13#10#13#10, String(hBuffer));
if rb > 0 then
rb := rb + 3 ;
  BlockWrite(NewFile, hBuffer[rb], iRead - rb);
  if (iRead <= 0) then break;
 end;
 CloseFile(NewFile);
 CloseSocket(hSocket);
 WSACleanup;
 result := 0;
end;
1.Как капчу в память Jpeg?
2.Насколька я понял, то эту функцию (function fWSRecv) не могут использовать несколько потоков одновременно?
Т.е. нужно использовать критические секции для исключения одновременного доступа к файлам( или памяти) из разных потоков. Или делать Массивную память, допустим у меня все равно больше 100 потоков не будет, и под каждый поток делать какойто цикл создания памяти Jpeg[i], где i это номер потока.

Мои мысли по поводу Jpeg:
Мне вместо этого
Код:
BlockWrite(NewFile, hBuffer[rb], iRead - rb);
надо вставить например

Код:
streamresponse:=TMemoryStream.Create;
while (TRUE) do
 begin
  FillChar(hBuffer, SizeOf(hBuffer), 0);
iRead := Recv(hSocket, hBuffer, length(hBuffer), 0);
     rb := pos(#13#10#13#10, String(hBuffer));
if rb > 0 then
rb := rb + 3 ;
      streamresponse.WriteBuffer(hBuffer[rb],iRead - rb);
       if (iRead <= 0) then break;
   end;
 streamresponse.Position:=0;
 JPEG:=TJPEGImage.Create;   //создаем jpeg
 JPEG.LoadFromStream(streamresponse);
   result:=JPEG;
  streamresponse.Clear;
   JPEG.Free;
3. И если можно в память картинку вставить, то как ее передать, так как на антигейт пост запрос такого вида :
Код:
multi:=Tidmultipartformdatastream.Create;
multi.AddFormField('method','post');
multi.AddFormField('key',apikey);
multi.AddFile('file',filename,ftype);
где filename- название файла?

Интересно насколько сложно распознавать капчу, с помощью нейронных сетей, мы как раз скоро в универебудем проходить, я понимаю что очень много зависит от самой картинки, например у моих капчей, белый фон или синий, а буквы черные или коричневые, буквы вплотную под разным искажением, но не пересекаються, т.е. вполне есть шансы распознать эту капчу через нейронные сети?

Сразу говорю Delphi тока начал учить, если что то не так не пинайте. Просто интересно было поработать с инди и посмотреть что это такое, а это только на дельфи. И в универе мы его не учим, учили С++, поэтому хочу посмотреть что за зверь такой делпфи.
 
Ответить с цитированием

  #2  
Старый 13.03.2010, 10:03
Аватар для GhostOnline
GhostOnline
Участник форума
Регистрация: 20.12.2008
Сообщений: 277
Провел на форуме:
828081

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

Чтобы хранить картинку в памяти, юзай TMemoryStream
Передать же в антикапчу картинку можно например вот так:
multi.AddObject ('file', ftype, '',image, 'captcha.' + itype);
где:
'file' - название поля
ftype - тип картинки, например 'image/pjpeg'
image - ссылка на объект типа TMemoryStream, в котором хранится картинка
'captcha.' + itype - название файла (значения в принципе не имеет)
 
Ответить с цитированием

  #3  
Старый 13.03.2010, 18:23
Аватар для trigada
trigada
Banned
Регистрация: 23.09.2009
Сообщений: 5
Провел на форуме:
70690

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

Все норм сделал через память, но интересует еще ответ на 2-й вопрос.
Цитата:
2.Насколька я понял, то эту функцию (function fWSRecv) не могут использовать несколько потоков одновременно?
Т.е. нужно использовать критические секции для исключения одновременного доступа к файлам( или памяти) из разных потоков. Или делать Массивную память, допустим у меня все равно больше 100 потоков не будет, и под каждый поток делать какойто цикл создания памяти Jpeg[i], где i это номер потока.
Можно ли функцию использовать одновреммено в потоках, или надо ставить крит. секции, и если надо ставить их то где? Там где происходит вызов этой функции, или в самой функции, там где заносим в память картинку?
 
Ответить с цитированием

  #4  
Старый 13.03.2010, 18:35
Аватар для greki_hoy
greki_hoy
Познающий
Регистрация: 04.03.2010
Сообщений: 32
Провел на форуме:
32525

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

Цитата:
Сообщение от trigada  
Все норм сделал через память, но интересует еще ответ на 2-й вопрос.


Можно ли функцию использовать одновреммено в потоках, или надо ставить крит. секции, и если надо ставить их то где? Там где происходит вызов этой функции, или в самой функции, там где заносим в память картинку?
чем меньше критическая секция тем лучше
синхронизация снижает производительность из
за гонки за право первым захватить ресурс
в то время как остальные потоки заблокируются
общее правило таково свести к минимуму
критический участок кода а в идеале рассмотреть
решения без синхронизации если возможно данную задачу так перепроектировать ну или по крайней мере свести ее синхронизацию к минимуму
 
Ответить с цитированием

  #5  
Старый 13.03.2010, 18:55
Аватар для M_script_
M_script_
Постоянный
Регистрация: 29.10.2008
Сообщений: 306
Провел на форуме:
1819761

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

Цитата:
Сообщение от trigada  
Можно ли функцию использовать одновреммено в потоках, или надо ставить крит. секции, и если надо ставить их то где? Там где происходит вызов этой функции, или в самой функции, там где заносим в память картинку?
Крит.секции не нужны.
greki_hoy, это общие фразы. Узким местом в подобном софте обычно остается скорость инета.

P.S.:
ТС, я вот только не понял, если на сокетах пишешь программу, почему работа с антигейтом через инди?

Последний раз редактировалось M_script_; 13.03.2010 в 18:57..
 
Ответить с цитированием

  #6  
Старый 13.03.2010, 19:27
Аватар для GhostOnline
GhostOnline
Участник форума
Регистрация: 20.12.2008
Сообщений: 277
Провел на форуме:
828081

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

Цитата:
Сообщение от trigada  
Все норм сделал через память, но интересует еще ответ на 2-й вопрос.


Можно ли функцию использовать одновреммено в потоках, или надо ставить крит. секции, и если надо ставить их то где? Там где происходит вызов этой функции, или в самой функции, там где заносим в память картинку?
Ограничивать надо доступ к глобальной переменной
Тут же вроде обращений к глобальным переменным нет, каждый поток работает со своими переменными, следовательно
критические секции не нужны.
 
Ответить с цитированием

  #7  
Старый 13.03.2010, 19:29
Аватар для trigada
trigada
Banned
Регистрация: 23.09.2009
Сообщений: 5
Провел на форуме:
70690

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

Ясно.
Думал что неважно с инди или нет, просто на антигейте сделано так, буду делать на сокетах функцию антигейт если нужно, это что то меняет ?
 
Ответить с цитированием

  #8  
Старый 13.03.2010, 20:18
Аватар для M_script_
M_script_
Постоянный
Регистрация: 29.10.2008
Сообщений: 306
Провел на форуме:
1819761

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

Если не важно, то зачем прогу на сокетах писать? Можно на инди.
Цитата:
Сообщение от GhostOnline  
Ограничивать надо доступ к глобальной переменной
Но если потоки не меняют значение глобальной переменной, то можно не синхронизировать.
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по Delphi Kandi С/С++, C#, Delphi, .NET, Asm 16 23.11.2009 10:06
Работа с RaveReport в Delphi (вопрос на засыпку) mr. ZetRikS С/С++, C#, Delphi, .NET, Asm 1 21.11.2009 21:07
вопрос: Delphi, изменить один и тот же параметр нескольких компонентов miqo С/С++, C#, Delphi, .NET, Asm 1 21.09.2009 07:00
Proxy FAQ foreva Чужие Статьи 12 04.01.2008 12:15



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


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




ANTICHAT.XYZ