Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2013, 11:04   #1
igh0st
Форумчанин
 
Аватар для igh0st
 
Регистрация: 05.07.2010
Сообщений: 136
По умолчанию Мультипотоковая проверка доступности порта

Требуется обеспечить проверку доступности порта набора адресов. Проверяю прекрасно с помощью Indy компонента TIdTCPClient:

Код:
IdTCPClient1.Host := '192.168.0.1';
IdTCPClient1.Port := 8080;
IdTCPClient1.Timeout := 50;
try
    IdTCPClient1.Connect;
except
end;

if IdTCPClient1.Connected then
    begin
        ShowMessage('Порт доступен');
        IdTCPClient1.Disconnect;
    end;
Но когда адресов много, то всё это дело занимает довольно продолжительное время. В общем, надо проверку отправлять в треды, а мне если честно так не хочется разбираться с этой мерихлюндией, да потом еще отлавливать ошибки... Други, если есть у кого рабочий код, киньте пожалуйста, буду премного благодарен.
igh0st вне форума Ответить с цитированием
Старый 22.10.2013, 11:39   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Но когда адресов много, то всё это дело занимает довольно продолжительное время.
Список IP:PORT разбирается потоками по 20% списка на поток, остаток отдаётся последнему потоку. Все.

Посчитать, сколько это 20% от 4775 строк - математика школьной программы.

если чисто порты, то строк 65535

Цитата:
а мне если честно так не хочется разбираться с этой мерихлюндией, да потом еще отлавливать ошибки... Други, если есть у кого рабочий код, киньте пожалуйста, буду премного благодарен.
Волков бояться - в лес не ходить.
Тогда зачем ты вообще в программмирование пошёл?
Человек_Борща вне форума Ответить с цитированием
Старый 22.10.2013, 11:47   #3
igh0st
Форумчанин
 
Аватар для igh0st
 
Регистрация: 05.07.2010
Сообщений: 136
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Волков бояться - в лес не ходить.
Тогда зачем ты вообще в программмирование пошёл?
С таким подходом надо весь код самому рисовать от начала до конца.

Вот решение, мож кому сгодиться:
Код:
unit OPingThread;

interface

uses
Classes, IdIcmpClient;

type
TPingNotify = procedure (AHost: string; ClientStatus: TReplyStatus)
of object;

TPingThread = class(TThread)
private
FIcmpClient: TIdIcmpClient;
FRunning: boolean;
FOnAfterPing: TPingNotify;
FHost: string;
{ Send result of ping to display it. }
procedure DoAfterPing;
protected
procedure Execute; override;
public
{ Thread that ping a TCllient host and send result to APingNotifyProc }
//constructor Create(Host: TClient; APingNotifyProc: TPingNotify);
reintroduce;
constructor Create(Host: string; APingNotifyProc: TPingNotify);
reintroduce;
destructor Destroy; override;
property Running: boolean read FRunning write FRunning;
property OnAfterPing: TPingNotify read FOnAfterPing write FOnAfterPing;
end;

implementation

uses
SyncObjs;

{ TPingThread }

constructor TPingThread.Create(Host: string; APingNotifyProc: TPingNotify);
begin
inherited Create(True);
FreeOnTerminate := True;
FIcmpClient := TIdIcmpClient.Create(nil);
//FIcmpClient.Host := Host.Address;
FIcmpClient.Host := Host;
FHost := Host;
FOnAfterPing := APingNotifyProc;
FRunning := false;
Resume;
end;

destructor TPingThread.Destroy;
begin
FIcmpClient.Free;
inherited;
end;

procedure TPingThread.DoAfterPing;
begin
if Assigned(FOnAfterPing) then
FOnAfterPing(FHost, FIcmpClient.ReplyStatus);
end;

procedure TPingThread.Execute;
var
doesPing: boolean;
nbPing: integer;
begin
doesPing := true;
nbPing := 0;
FRunning := true;

while not Terminated do
begin
FIcmpClient.Ping;
Inc(nbPing);
if (FIcmpClient.Host = FIcmpClient.ReplyStatus.FromIpAddress) and
(FIcmpClient.ReplyStatus.BytesReceived > 0) then
doesPing := false;

if (not doesPing) or (nbPing > 3) then
Terminate;
end;
FRunning := false;
Synchronize(DoAfterPing);
end;

end.
igh0st вне форума Ответить с цитированием
Старый 22.10.2013, 13:16   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
С таким подходом надо весь код самому рисовать от начала до конца.
В 90% случаев, так и происходит, ибо готового кода с гулькин нос
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ПРОВЕРКА LPT порта bit.um Компьютерное железо 2 17.12.2011 20:26
Проверка доступности файла Freezer Общие вопросы Delphi 2 25.03.2011 10:32
проверка порта!! Dryg2009 Работа с сетью в Delphi 4 02.11.2009 18:04
Проверка доступности сервера xmaratx Работа с сетью в Delphi 2 21.04.2009 16:14
Проверка доступности файла Marsik Помощь студентам 2 05.04.2008 09:53