trigada
13.03.2010, 06:06
Здраствуйте.
Такой вопрос:
Пытаюсь разобраться с написанием многопоточной программки, с помощью "Винсок". Потоки как бы сделал все норм. Мне нужно взять капчу и передавать ее на антигейт.ком, воспользовавшись
кодом который показал 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 тока начал учить, если что то не так не пинайте. Просто интересно было поработать с инди и посмотреть что это такое, а это только на дельфи. И в универе мы его не учим, учили С++, поэтому хочу посмотреть что за зверь такой делпфи.
Такой вопрос:
Пытаюсь разобраться с написанием многопоточной программки, с помощью "Винсок". Потоки как бы сделал все норм. Мне нужно взять капчу и передавать ее на антигейт.ком, воспользовавшись
кодом который показал 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 тока начал учить, если что то не так не пинайте. Просто интересно было поработать с инди и посмотреть что это такое, а это только на дельфи. И в универе мы его не учим, учили С++, поэтому хочу посмотреть что за зверь такой делпфи.