» Вопросы по Delphi 2
Вопрос:
Установил пароль на базу данных Ассеса. В делфи 6 в компоненте ADOConnection в строке подключения указываю этот пароль, но все равно выдается сообщение: что пароль неправильный. В чем здесь загвоздка. Заранее спасибо.
Установил пароль на базу данных Ассеса. В делфи 6 в компоненте ADOConnection в строке подключения указываю этот пароль, но все равно выдается сообщение: что пароль неправильный. В чем здесь загвоздка. Заранее спасибо.
в конец устал от неработающего в XP дебаггера Delphi 5 и заставил себя перевести разработки на 2006. Все проблемы вроде решил - одна осталась - озадачен новым формат Help'а - есть ли способ сконвертировать/установить в него help'ы от старых библиотек?
начал работать с базами данных Access
есть ли в дельфи что то вроде того что бы данные с таблицы(базы даных) перенести в компонент Tmemo в определенном формате...?
есть ли есть какова реализация такого приема...
p/s
но не так что бы сохранять всю базу целиком а только строку из базы данных
есть ли в дельфи что то вроде того что бы данные с таблицы(базы даных) перенести в компонент Tmemo в определенном формате...?
есть ли есть какова реализация такого приема...
p/s
но не так что бы сохранять всю базу целиком а только строку из базы данных
GTA3
Если Tmemo можно заменить на TListView - могу привести код процедуры, которая выполняет SQL запрос и выводит результаты в указанный TListView
зы SQL указывается в виде параметра
Если Tmemo можно заменить на TListView - могу привести код процедуры, которая выполняет SQL запрос и выводит результаты в указанный TListView
зы SQL указывается в виде параметра
Vetal303
а с компонента TListViev можно сохранить данные в файл в текстовом формате?
а с компонента TListViev можно сохранить данные в файл в текстовом формате?
GTA3
просто так - нет!
но если полистать DelphiWorld то там есть способы сохранения
ЗЫ если будут вопроси в ПМ или в аську
просто так - нет!
но если полистать DelphiWorld то там есть способы сохранения
ЗЫ если будут вопроси в ПМ или в аську
GTA3
вот функция из DelphiWorld, сохранение TListWiew в HTML
Код: #output: имя файла для экспорта
function ListViewConfHTML(Listview:TListview; output:string; center: Boolean) : Boolean;
var i,f: Integer; tfile: TextFile;
begin try
ForceDirectories(ExtractFilePath(output));
AssignFile(tfile,output);
ReWrite(tfile);
WriteLn(tfile,'<html><head><title>Exported from: '+listview.Name+'</title></head><body>');
WriteLn(tfile,'<table border="1" bordercolor="#666"><tr>');
for i := 0 to listview.Columns.Count - 1 do begin
if center then
WriteLn(tfile,'<td><b><center>'+listview.columns[i].caption+'</center></b></td>') else
WriteLn(tfile,'<td><b>'+listview.columns[i].caption+'</b></td>');
end;
WriteLn(tfile,'</tr><tr>');
for i := 0 to listview.Items.Count-1 do begin
WriteLn(tfile,'<td>'+listview.items.item[i].caption+'</td>');
for f := 0 to listview.Columns.Count-2 do begin
if listview.items.item[i].subitems[f]='' then Write(tfile,'<td>-</td>') else
Write(tfile,'<td>'+listview.items.item[i].subitems[f]+'</td>');
end;
Write(tfile,'</tr>');
end;
WriteLn(tfile,'</table></body></html>');
CloseFile(tfile);
Result := True;
except Result := False;
end;
end;
вот функция из DelphiWorld, сохранение TListWiew в HTML
Код: #output: имя файла для экспорта
function ListViewConfHTML(Listview:TListview; output:string; center: Boolean) : Boolean;
var i,f: Integer; tfile: TextFile;
begin try
ForceDirectories(ExtractFilePath(output));
AssignFile(tfile,output);
ReWrite(tfile);
WriteLn(tfile,'<html><head><title>Exported from: '+listview.Name+'</title></head><body>');
WriteLn(tfile,'<table border="1" bordercolor="#666"><tr>');
for i := 0 to listview.Columns.Count - 1 do begin
if center then
WriteLn(tfile,'<td><b><center>'+listview.columns[i].caption+'</center></b></td>') else
WriteLn(tfile,'<td><b>'+listview.columns[i].caption+'</b></td>');
end;
WriteLn(tfile,'</tr><tr>');
for i := 0 to listview.Items.Count-1 do begin
WriteLn(tfile,'<td>'+listview.items.item[i].caption+'</td>');
for f := 0 to listview.Columns.Count-2 do begin
if listview.items.item[i].subitems[f]='' then Write(tfile,'<td>-</td>') else
Write(tfile,'<td>'+listview.items.item[i].subitems[f]+'</td>');
end;
Write(tfile,'</tr>');
end;
WriteLn(tfile,'</table></body></html>');
CloseFile(tfile);
Result := True;
except Result := False;
end;
end;
nuker2015
В DesignTime при нажатии кнопки Проверить подключение выдает ошибку связи:
"Не выполнена проверка подключения из-за ошибки при инициализации поставщика. Не удается запустить приложения. Системная база отсутсвует или открыта с монопольным доступом другим пользователем."
Хотя база данных в ассесе не открыта и путь к ней задан правильно.
При запуске программы выдает исключение "Ошибочный пароль".
Строка подключения сдедующая:
Код: Provider=Microsoft.Jet.OLEDB.4.0;Password=1;User ID=Admin;Data Source=Basa\Ispol_list.mdb;Mode=Share Deny None;Extended Properties="";Persist Security Info=True;Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False
В DesignTime при нажатии кнопки Проверить подключение выдает ошибку связи:
"Не выполнена проверка подключения из-за ошибки при инициализации поставщика. Не удается запустить приложения. Системная база отсутсвует или открыта с монопольным доступом другим пользователем."
Хотя база данных в ассесе не открыта и путь к ней задан правильно.
При запуске программы выдает исключение "Ошибочный пароль".
Строка подключения сдедующая:
Код: Provider=Microsoft.Jet.OLEDB.4.0;Password=1;User ID=Admin;Data Source=Basa\Ispol_list.mdb;Mode=Share Deny None;Extended Properties="";Persist Security Info=True;Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False
русским же языком написанно: "из-за ошибки при инициализации поставщика"
похоже jet крыво стал/упал. переставь его
похоже jet крыво стал/упал. переставь его
pit23
Попробуй указать полный путь к базе.
поставь Jet OLEDB:Database Password="1"
Provider=Microsoft.Jet.OLEDB.4.0;
Password=1;
User ID=Admin;
Data Source=УКАЖИ ПОЛНЫЙ ПУТЬ;
Mode=Share Deny None;
кроме этих строчек тебе ничего ненадо.
Попробуй указать полный путь к базе.
поставь Jet OLEDB:Database Password="1"
Provider=Microsoft.Jet.OLEDB.4.0;
Password=1;
User ID=Admin;
Data Source=УКАЖИ ПОЛНЫЙ ПУТЬ;
Mode=Share Deny None;
кроме этих строчек тебе ничего ненадо.
Подскажите зачем нужен тип Variant?
kzsergo
Цитата:
Цитата:
Тип Variant
В Delphi 2.0 был введен новый мощный тип данных — Variant. В основном его назначение состояло в поддержке автоматизации OLK, где тип данных Variant используется очень широко. Фактически, тип Variant языка Object Pascal является инкапсуляцией вариантов OLE. Как мы вскоре увидим, реализация в Delphi вариантов оказалась полезной и с точки зрения других аспектов программирования. Object Pascal является единственным компилируемым языком, в котором для работы с вариантами OLE введен специализированный тип данных, представляемый как динамический во время выполнения программы и как статический во время ее компиляции.
В Delphi 3 для этой же цели был введен еще один новый тип данных — OleVariant, полностью идентичный типу Variant, за исключением того, что он может вмещать только те типы, которые являются совместимыми с OLE Дальше в этом разделе мы подробно рассмотрим тип Variant, a также обсудим те отличия, которые имеются между типами данных OleVariant и Variant.
dyr farot
Цитата:
Так не у меня одного этот бок возник. У коллеги по работе та же самая
ситуация была на другом компе. У него тоже jet криво стал да ?
P.S. Если конечно это высказывание по моему вопросу.
nuker2015
Ша попробую.
Добавлено:
nuker2015
До меня дошло в чем была проблема. В строке подключения не надо писать строку:
Password=1;
А только:
Jet OLEDB:Database Password=1
Все равно спасибо.
Цитата:
русским же языком написанно: "из-за ошибки при инициализации поставщика"
похоже jet крыво стал/упал. переставь его
Так не у меня одного этот бок возник. У коллеги по работе та же самая
ситуация была на другом компе. У него тоже jet криво стал да ?
P.S. Если конечно это высказывание по моему вопросу.
nuker2015
Ша попробую.
Добавлено:
nuker2015
До меня дошло в чем была проблема. В строке подключения не надо писать строку:
Password=1;
А только:
Jet OLEDB:Database Password=1
Все равно спасибо.
как скопировать результат (одно число) заносимый в edit в буфер обмена
dmit000
Edit1.SelectAll;
Edit1.CopyToClipboard;
Edit1.SelectAll;
Edit1.CopyToClipboard;
dmit000
Код:
Clipboard.Clear;
Clipboard.SetTextBuf(PChar(Edit1.text));
Код:
Clipboard.Clear;
Clipboard.SetTextBuf(PChar(Edit1.text));
спасибо
uses ... , clipbrd;
Clipboard.AsText:=Edit1.Text;
Clipboard.AsText:=Edit1.Text;
Нужен сканер портов, а точнее одного порта на диапазоне ip адресов. Все, что пришло в голову обладает ничтожно малой скоростью сканирования. [more=Пример медленного сканирования]program scan;
{$APPTYPE CONSOLE}
{ Для использования winsock необходимо описать этот модуль в uses. }
uses
sysutils,winsock;
{ дефолтовый порт Socks прокси. Сюда можно вписать любой порт, превратив наш сканнер, к примеру, в httpd (80 порт) сканнер. }
const
port = 1080;
{ Здесь объявляем переменные }
var
D:WSAData;
S:TSocket;
A:TSockAddr;
m1,m2,mask,val:String;
i:Integer;
begin
{ Если наш сканер запущен без параметров, выводим некоторую информацию.. }
if paramcount < 1 then
begin
writeln('Socks Scanner by Dark Lord aka har0n, darklord@smtp.ru');
writeln('Example: scan.exe 127.0.0 1-255');
writeln('http://www.security.net.tf');
exit;
end
else
{ Если сканер запущен с параметрами, в переменную mask заносим 1-ый параметр, в val 2-ой параметр }
begin
mask:=paramstr(1);
val:=paramstr(2);
{ Определяем диапазон сканирования}
m1:= copy(val,1,pos('-',val)-1);
m2:= copy(val,pos('-',val)+1,length(val));
writeln('- Scanning begin: '+mask+'.'+m1+' - '+mask+'.'+m2+' -');
writeln;
{ Если WSAStartup() возвращает не нулевое значение, выводим сообщение об ошибке и выходим из программы}
if WSAStartup($101,D)<>0 then
begin
writeln('error..');
exit;
end;
{ Начинаем процесс сканирования }
for i:= strtoint(m1) to strtoint(m2) do
begin
{ Определяем тип семейства сокетов, и IP адрес для сканирования }
A.sin_family:=AF_INET;
A.sin_addr.S_addr:=inet_addr(pchar(mask+'.'+inttostr(i)));
{ Создаем сокет }
S:=socket(AF_INET,SOCK_STREAM,0);
{ Если возвращено значение INVALID_SOCKET, выводим сообщение об ошибке }
if S=INVALID_SOCKET then
writeln('socket error');
{ Определяем порт (задается константой) }
A.sin_port:=htons(port);
{ Пытаемся подконнектиться, если удачно - выводим сообщение, что порт открыт, в другом случае - сообщение о том, что порт закрыт (или недоступен) }
if connect(S,A,sizeof(A))=0 then
writeln(mask+'.'+inttostr(i)+' port '+inttostr(port)+' opened') else
writeln(mask+'.'+inttostr(i)+' port '+inttostr(port)+' closed');
end;
{ Завершаем работу с сокетами }
WSACleanup;
writeln;
writeln('- Scanning is completed -');
end;
end. [/more]
Посоветуйте как оптимизировать?
{$APPTYPE CONSOLE}
{ Для использования winsock необходимо описать этот модуль в uses. }
uses
sysutils,winsock;
{ дефолтовый порт Socks прокси. Сюда можно вписать любой порт, превратив наш сканнер, к примеру, в httpd (80 порт) сканнер. }
const
port = 1080;
{ Здесь объявляем переменные }
var
D:WSAData;
S:TSocket;
A:TSockAddr;
m1,m2,mask,val:String;
i:Integer;
begin
{ Если наш сканер запущен без параметров, выводим некоторую информацию.. }
if paramcount < 1 then
begin
writeln('Socks Scanner by Dark Lord aka har0n, darklord@smtp.ru');
writeln('Example: scan.exe 127.0.0 1-255');
writeln('http://www.security.net.tf');
exit;
end
else
{ Если сканер запущен с параметрами, в переменную mask заносим 1-ый параметр, в val 2-ой параметр }
begin
mask:=paramstr(1);
val:=paramstr(2);
{ Определяем диапазон сканирования}
m1:= copy(val,1,pos('-',val)-1);
m2:= copy(val,pos('-',val)+1,length(val));
writeln('- Scanning begin: '+mask+'.'+m1+' - '+mask+'.'+m2+' -');
writeln;
{ Если WSAStartup() возвращает не нулевое значение, выводим сообщение об ошибке и выходим из программы}
if WSAStartup($101,D)<>0 then
begin
writeln('error..');
exit;
end;
{ Начинаем процесс сканирования }
for i:= strtoint(m1) to strtoint(m2) do
begin
{ Определяем тип семейства сокетов, и IP адрес для сканирования }
A.sin_family:=AF_INET;
A.sin_addr.S_addr:=inet_addr(pchar(mask+'.'+inttostr(i)));
{ Создаем сокет }
S:=socket(AF_INET,SOCK_STREAM,0);
{ Если возвращено значение INVALID_SOCKET, выводим сообщение об ошибке }
if S=INVALID_SOCKET then
writeln('socket error');
{ Определяем порт (задается константой) }
A.sin_port:=htons(port);
{ Пытаемся подконнектиться, если удачно - выводим сообщение, что порт открыт, в другом случае - сообщение о том, что порт закрыт (или недоступен) }
if connect(S,A,sizeof(A))=0 then
writeln(mask+'.'+inttostr(i)+' port '+inttostr(port)+' opened') else
writeln(mask+'.'+inttostr(i)+' port '+inttostr(port)+' closed');
end;
{ Завершаем работу с сокетами }
WSACleanup;
writeln;
writeln('- Scanning is completed -');
end;
end. [/more]
Посоветуйте как оптимизировать?
Jokerjar Запускать потоков 20-100. Работает существенно быстрее.
Кто-нибудь пробовал ставить BDS Community Welcome Page v2?
При открытии в поле Notification пишет "Init Error: 'documentElement' is null or not an object"
И напрочь отказывается что-либо загружать - "Access is denied." и все тут.
Попытка отключить Outpost ни к чему не привела. Где грабли?
При открытии в поле Notification пишет "Init Error: 'documentElement' is null or not an object"
И напрочь отказывается что-либо загружать - "Access is denied." и все тут.
Попытка отключить Outpost ни к чему не привела. Где грабли?
По поводу сканирования порта на диапазоне ip адресов. Узнал, что нужно использовать асинхронный метод сканирования, т.е. создавать массив сокетов и проверять одновременно не сколько ip (winsock2). Требуется исходник (не сканер портов, а сканер определенного порта на диапазоне Ip). Поделитесь, кто имеет
Arvur
Цитата:
У меня пашет без проблем. Стоят все паки и фиксы ... В сеть ходит через проксю... Правда тормозит оно не по детски... Особенно неудобно при частой перезагрузке проектов... В итоге отрубил эту беду до лучших времён ...
Цитата:
DS Community Welcome Page v2
У меня пашет без проблем. Стоят все паки и фиксы ... В сеть ходит через проксю... Правда тормозит оно не по детски... Особенно неудобно при частой перезагрузке проектов... В итоге отрубил эту беду до лучших времён ...
Arvur
читаем и спрашиваем теперь тут по BDS
http://forum.ru-board.com/topic.cgi?forum=33&topic=7143#1
читаем и спрашиваем теперь тут по BDS
http://forum.ru-board.com/topic.cgi?forum=33&topic=7143#1
Можно ли в Delphi упорядочить набор данных по вычисляемому в OnCalcFields полю?
YFred
Цитата:
Код: MyDataset1.IndexFieldNames := 'Мое_выч_поле';
MyDataset1.First;
Цитата:
Можно ли в Delphi упорядочить набор данных по вычисляемому в OnCalcFields полюнекогда проверить, но, судя по всему можно так:
Код: MyDataset1.IndexFieldNames := 'Мое_выч_поле';
MyDataset1.First;
ShIvADeSt
Цитата:
Ок. Правильное решение
All
Цитата:
YFred
SERGE_BLIZNUK
Есть подозрение, что это зависит от класса DataSet'а. Так что имхо нужно уточнять, о какой компоненте идет речь.
Цитата:
читаем и спрашиваем теперь тут по BDS
Ок. Правильное решение
All
Цитата:
BDS Community Welcome Page v2Ответ нашелся, закину в вопросы по BDS
YFred
SERGE_BLIZNUK
Есть подозрение, что это зависит от класса DataSet'а. Так что имхо нужно уточнять, о какой компоненте идет речь.
Цитата:
Есть подозрение, что это зависит от класса DataSet'а.
Компанент TAdsQuery
Ищу открытый порт на диапазоне ip адресов (используется возможность асинхронности сетевых функций, сканируется по 40 ip-адресов с максимальным временем ожидания - 1 сек (tv.tv_sec := 1;)).
[more=Сам алгоритм]uses
winsock2;
.........
function LookupName(host: string): TInAddr;
var
HostEnt: PHostEnt;
InAddr: TInAddr;
begin
if host[4]='.' then
InAddr.s_addr := inet_addr(PChar(host))
else
begin
HostEnt := gethostbyname(PChar(host));
FillChar(InAddr, SizeOf(InAddr), 0);
if HostEnt <> nil then
begin
with InAddr, HostEnt^ do
begin
S_un_b.s_b1 := h_addr^[0];
S_un_b.s_b2 := h_addr^[1];
S_un_b.s_b3 := h_addr^[2];
S_un_b.s_b4 := h_addr^[3];
end;
end
end;
Result := InAddr;
end;
procedure ScanDiapazon(mask,startip,endip: string);
const
PortNum = 135;
var
k: integer;
st: string;
i,j,s, opt, index: Integer;
FSocket: array [0..39] of TSOCKET;
busy : array [0..39] of boolean;
masks : array [0..39] of integer;
addr : TSockAddr;
hEvent : THandle;
fset : TFDset;
tv : TTimeval;
tec : PServEnt;
PName:String;
GInitData : TWSADATA;
begin
Form1.ProgressBar1.Max:=StrToInt(endip);
WSAStartup(MAKEWORD(2,0), GInitData);
i:=StrToInt(startip);
addr.sin_family := AF_INET;
addr.sin_addr.s_addr := INADDR_ANY;
addr.sin_port := htons(PortNum);
index:=40;
hEvent := WSACreateEvent();
while i<StrToInt(endip) do
begin
///Запуск сканирования портов
for j:=0 to index do
busy[j]:=false;
for j:=0 to index do
begin
if i>StrToInt(endip) then
begin
index:=j-1;
break;
end;
FSocket[j] := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
WSAEventSelect(FSocket[j], hEvent, FD_WRITE + FD_CONNECT);
addr.sin_addr := LookupName(mask+inttostr(i));
connect(FSocket[j], @addr, sizeof(addr));
Application.ProcessMessages;
if WSAGetLastError()=WSAEINPROGRESS then
begin
closesocket (FSocket[j]);
busy[j]:=true;
end;
masks[j]:=i;
i:=i+1;
end;
FD_Zero(fset);
for j := 0 to index do
begin
if busy[j] <> true then
FD_SET (FSocket[j], fset);
end;
Application.ProcessMessages;
tv.tv_sec := 1;
tv.tv_usec := 0;
s:=select (1, nil, @fset, nil, @tv);
Application.ProcessMessages;
for j := 0 to index do
begin
if busy[j] then continue;
if FD_ISSET (FSocket[j], fset) then
begin
s:=Sizeof(Opt);
opt:=1;
getsockopt(FSocket[j], SOL_SOCKET, SO_ERROR, @opt, s);
if opt=0 then
form1.Memo1.Lines.Add(mask+IntToStr(masks[j])+' - порт открыт');
end;
closesocket(FSocket[j]);
end;
Form1.ProgressBar1.Position:=i;
end;
WSACloseEvent(hEvent);
Form1.Memo1.Lines.Add('Сканирование закончено...');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
scandiapazon('192.168.1.','1','255');
end;[/more]
Хотя теоретически алгоритм без ошибок, но почему то сканер показывает не все адреса с открытым портом (сканирую локальную сеть 100 мбит) . Увеличение времени ожидания ничего не меняет. Возможно, я что-то упустил? Этот же алгоритм при сканировании диапазона портов одного ip (если поменять местами строки addr.sin_port := htons(PortNum); и addr.sin_addr := LookupName(mask+inttostr(i));, Ip указывать явно, а порту присваивать i) показывает все верно. В чем проблема то???
[more=Сам алгоритм]uses
winsock2;
.........
function LookupName(host: string): TInAddr;
var
HostEnt: PHostEnt;
InAddr: TInAddr;
begin
if host[4]='.' then
InAddr.s_addr := inet_addr(PChar(host))
else
begin
HostEnt := gethostbyname(PChar(host));
FillChar(InAddr, SizeOf(InAddr), 0);
if HostEnt <> nil then
begin
with InAddr, HostEnt^ do
begin
S_un_b.s_b1 := h_addr^[0];
S_un_b.s_b2 := h_addr^[1];
S_un_b.s_b3 := h_addr^[2];
S_un_b.s_b4 := h_addr^[3];
end;
end
end;
Result := InAddr;
end;
procedure ScanDiapazon(mask,startip,endip: string);
const
PortNum = 135;
var
k: integer;
st: string;
i,j,s, opt, index: Integer;
FSocket: array [0..39] of TSOCKET;
busy : array [0..39] of boolean;
masks : array [0..39] of integer;
addr : TSockAddr;
hEvent : THandle;
fset : TFDset;
tv : TTimeval;
tec : PServEnt;
PName:String;
GInitData : TWSADATA;
begin
Form1.ProgressBar1.Max:=StrToInt(endip);
WSAStartup(MAKEWORD(2,0), GInitData);
i:=StrToInt(startip);
addr.sin_family := AF_INET;
addr.sin_addr.s_addr := INADDR_ANY;
addr.sin_port := htons(PortNum);
index:=40;
hEvent := WSACreateEvent();
while i<StrToInt(endip) do
begin
///Запуск сканирования портов
for j:=0 to index do
busy[j]:=false;
for j:=0 to index do
begin
if i>StrToInt(endip) then
begin
index:=j-1;
break;
end;
FSocket[j] := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
WSAEventSelect(FSocket[j], hEvent, FD_WRITE + FD_CONNECT);
addr.sin_addr := LookupName(mask+inttostr(i));
connect(FSocket[j], @addr, sizeof(addr));
Application.ProcessMessages;
if WSAGetLastError()=WSAEINPROGRESS then
begin
closesocket (FSocket[j]);
busy[j]:=true;
end;
masks[j]:=i;
i:=i+1;
end;
FD_Zero(fset);
for j := 0 to index do
begin
if busy[j] <> true then
FD_SET (FSocket[j], fset);
end;
Application.ProcessMessages;
tv.tv_sec := 1;
tv.tv_usec := 0;
s:=select (1, nil, @fset, nil, @tv);
Application.ProcessMessages;
for j := 0 to index do
begin
if busy[j] then continue;
if FD_ISSET (FSocket[j], fset) then
begin
s:=Sizeof(Opt);
opt:=1;
getsockopt(FSocket[j], SOL_SOCKET, SO_ERROR, @opt, s);
if opt=0 then
form1.Memo1.Lines.Add(mask+IntToStr(masks[j])+' - порт открыт');
end;
closesocket(FSocket[j]);
end;
Form1.ProgressBar1.Position:=i;
end;
WSACloseEvent(hEvent);
Form1.Memo1.Lines.Add('Сканирование закончено...');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
scandiapazon('192.168.1.','1','255');
end;[/more]
Хотя теоретически алгоритм без ошибок, но почему то сканер показывает не все адреса с открытым портом (сканирую локальную сеть 100 мбит) . Увеличение времени ожидания ничего не меняет. Возможно, я что-то упустил? Этот же алгоритм при сканировании диапазона портов одного ip (если поменять местами строки addr.sin_port := htons(PortNum); и addr.sin_addr := LookupName(mask+inttostr(i));, Ip указывать явно, а порту присваивать i) показывает все верно. В чем проблема то???
Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
Предыдущая тема: Событие STFilter(DBGridEh) ???
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.