Форум: "Начинающим";
Текущий архив: 2008.09.14;
Скачать: [xml.tar.bz2];
ВнизПинг Найти похожие ветки
← →
DeeNamid © (2008-08-04 17:26) [40]
> Medbe}I{onok XML
Харе прикалываться :)) Посмотри на 38 пост, с пингом какие-то замороки.
← →
Сергей М. © (2008-08-04 17:27) [41]Ничего защищать не надо.
Экз-ры IdIcmpClient"ов полностью автономны и никак не влияют на работу друг друга.
Res - это не локальная переменная , а поле объекта класса TPing. Сколько объектов, столько и полей.
← →
Dennis I. Komarov © (2008-08-04 17:33) [42]> [40] DeeNamid © (04.08.08 17:26)
Проведи следственный эксперимент: Пусть каждый поток пишет все в свой файл. Ни какой визуализации. Уйдешь от синхронизации и крит. секций ...
← →
DeeNamid © (2008-08-04 17:35) [43]Сейчас попробую.
← →
DeeNamid © (2008-08-04 17:49) [44]Пипец какой-то. Делаю так:
function Tping.ping_func(icmp:TIdIcmpClient;host:string):integer;
var i,failed:integer;
f:textfile;
begin
icmp.ReceiveTimeout:=3000;
icmp.Host:=host;
//EnterCriticalSection(CS);
icmp.Ping();
//LeaveCriticalSection(CS);
if icmp.ReplyStatus.ReplyStatusType<>rsTimeOut then
i:=icmp.ReplyStatus.MsRoundTripTime
else
i:=0;
bite:=icmp.ReplyStatus.BytesReceived;
assignfile(f,file_name);
append(f);
writeln(f,i);
closefile(f);
end;
Вот файлы: 1-ый
62 62 62 63 62 63 63 62 62 47 63
2-ой
62 62 62 63 62 63 63 62 62
3-ий
62 62 62 63 62 63 63 62 62
4-ый
62 62 62 63 62 63 63 62 62 47
5-ый
78 62 62 63 62 63 63 62 62 47
Я вообще не понимаю откуда эти цифры берутся, нереальные какие-то числа.
← →
Slym © (2008-08-04 18:11) [45]А вы вкурсях что индевая пинга рав сокет юзает? воркает только под одмином и с "открытым" для рав файрволом...
не проще юзать виндовый ICMP.DLL?
по теме:
1. критические секции тут нафег не нужны
2. вы между пингами хоть секунду поспите, а то какаято дос атака получается :)
3. ping_func:=0; - это круто, 10Gbit?
← →
DeeNamid © (2008-08-04 18:18) [46]В курсях )) мне под одмином и надо, про файрволл не знаю...
1. Смотри посты, пингует нормально только с критическими секциями, без них пишет полную ерунду.
2. Пробовал бесполезно, пишет ту-же ерунду только медленно.
3. Не понял юмора, ping_func:=0 это означает что превышен интервал ожидания ))
← →
Сергей М. © (2008-08-04 20:01) [47]
> с критическими секциями
Ты уже упарил всех своим "критическими")
Ты ими что защищаешь ? Какой ресурс ?
Версия Инди, в конце концов, какая ?
← →
Slym © (2008-08-05 05:23) [48]накидал за 10!мин:
это было:unit Icmp;
interface
uses Windows,WinSock,SysUtils;
Const
IP_SUCCESS = 0;
IP_STATUS_BASE = 11000;
IP_BUF_TOO_SMALL = (IP_STATUS_BASE + 1);
IP_DEST_NET_UNREACHABLE = (IP_STATUS_BASE + 2);
IP_DEST_HOST_UNREACHABLE = (IP_STATUS_BASE + 3);
IP_DEST_PROT_UNREACHABLE = (IP_STATUS_BASE + 4);
IP_DEST_PORT_UNREACHABLE = (IP_STATUS_BASE + 5);
IP_NO_RESOURCES = (IP_STATUS_BASE + 6);
IP_BAD_OPTION = (IP_STATUS_BASE + 7);
IP_HW_ERROR = (IP_STATUS_BASE + 8);
IP_PACKET_TOO_BIG = (IP_STATUS_BASE + 9);
IP_REQ_TIMED_OUT = (IP_STATUS_BASE + 10);
IP_BAD_REQ = (IP_STATUS_BASE + 11);
IP_BAD_ROUTE = (IP_STATUS_BASE + 12);
IP_TTL_EXPIRED_TRANSIT = (IP_STATUS_BASE + 13);
IP_TTL_EXPIRED_REASSEM = (IP_STATUS_BASE + 14);
IP_PARAM_PROBLEM = (IP_STATUS_BASE + 15);
IP_SOURCE_QUENCH = (IP_STATUS_BASE + 16);
IP_OPTION_TOO_BIG = (IP_STATUS_BASE + 17);
IP_BAD_DESTINATION = (IP_STATUS_BASE + 18);
// The next group are status codes passed up on status indications to
// transport layer protocols.
IP_ADDR_DELETED = (IP_STATUS_BASE + 19);
IP_SPEC_MTU_CHANGE = (IP_STATUS_BASE + 20);
IP_MTU_CHANGE = (IP_STATUS_BASE + 21);
IP_UNLOAD = (IP_STATUS_BASE + 22);
IP_GENERAL_FAILURE = (IP_STATUS_BASE + 50);
MAX_IP_STATUS = IP_GENERAL_FAILURE;
IP_PENDING = (IP_STATUS_BASE + 255);
(* // Values used in the IP header Flags field.
IP_FLAG_DF = $2; // Don"t fragment this packet.
// Supported IP Option Types.
// These types define the options which may be used in the OptionsData field
// of the ip_option_information structure. See RFC 791 for a complete
// description of each.
IP_OPT_EOL = 0; // End of list option
IP_OPT_NOP = 1; // No operation
IP_OPT_SECURITY = $82; // Security option
IP_OPT_LSRR = $83; // Loose source route
IP_OPT_SSRR = $89; // Strict source route
IP_OPT_RR = $7; // Record route
IP_OPT_TS = $44; // Timestamp
IP_OPT_SID = $88; // Stream ID (obsolete)
MAX_OPT_SIZE = 40; // Maximum length of IP options in bytes*)
type
PIPOptionInformation=^TIPOptionInformation;
TIPOptionInformation=packed record
Ttl:byte; // Время жизни (используется traceroute-ом)
Tos:byte; // Тип обслуживания, обычно 0
Flags : byte; // Флаги заголовка IP, обычно 0
OptionsSize: byte; // Размер данных в заголовке, обычно 0, максимум 40
OptionsData: Pointer; // Указатель на данные
end;
PIcmpEchoReply=^TIcmpEchoReply;
TIcmpEchoReply = packed record
Address:TInAddr; // Адрес отвечающего
Status:Longint; // IP_STATUS (см. ниже)
RTTime:Longint; // Время между эхо-запросом и эхо-ответом в миллисекундах
DataSize:Word; // Размер возвращенных данных
Reserved:Word; // Зарезервировано
Data:Pointer; // Указатель на возвращенные данные
Options:TIPOptionInformation; // Информация из заголовка IP
end;
PIcmpEchoReplyEx=^TIcmpEchoReplyEx;
TIcmpEchoReplyEx = packed record
IcmpEchoReply:TIcmpEchoReply;
RawData:array[0..0] of char;
end;
function IcmpCreateFile:THandle;stdcall;
function IcmpCloseHandle(IcmpHandle:THandle):LongBool;stdcall;
function IcmpSendEcho(IcmpHandle:THandle;DestAddress:Longint;
RequestData:Pointer;RequestSize:Word;RequestOptns:PIPOptionInformation;
ReplyBuffer:pointer;ReplySize:DWORD;Timeout:DWORD):Longint;stdcall;
function FormatIcmpEchoReply(IcmpEchoReply:TIcmpEchoReply):string;
function IcmpEcho(const Address:string;TimeOut:integer=3000;Size:word=16):TIcmpEchoReply;
implementation
const IcmpDLL="ICMP.DLL";
resourcestring
SSuccess="Ответ от %s: число байт=%d время=%dмс TTL=%d";
STTL_EXPIRED_TRANSIT="Ответ от %s: Превышен срок жизни (TTL) при передаче пакета.";
SREQ_TIMED_OUT="Превышен интервал ожидания для запроса.";
SElse="Ответ от %s: код ответа=%d";
function IcmpCreateFile; external IcmpDLL name "IcmpCreateFile";
function IcmpCloseHandle; external IcmpDLL name "IcmpCloseHandle";
function IcmpSendEcho; external IcmpDLL name "IcmpSendEcho";
function FormatIcmpEchoReply(IcmpEchoReply:TIcmpEchoReply):string;
begin
case IcmpEchoReply.Status of
IP_SUCCESS: result:=Format(SSuccess,[StrPas(inet_ntoa(IcmpEchoReply.Address)),IcmpEchoReply. DataSize,IcmpEchoReply.RTTime,IcmpEchoReply.Options.Ttl]);
IP_REQ_TIMED_OUT: result:=SREQ_TIMED_OUT;
IP_TTL_EXPIRED_TRANSIT: result:=Format(STTL_EXPIRED_TRANSIT,[StrPas(inet_ntoa(IcmpEchoReply.Address))]);
else
result:=Format(SElse,[StrPas(inet_ntoa(IcmpEchoReply.Address)),IcmpEchoReply.Sta tus]);
end;
end;
function IcmpEcho(const Address:string;TimeOut:integer=3000;Size:word=16):TIcmpEchoReply;
var
WSAData:TWSAData;
Host:longint;
PIerSize:integer;
PIer:PIcmpEchoReplyEx;
hIcmp:THandle;
begin
if WSAStartup(MakeWord(1,1),WSAData)<>0 then RaiseLastOSError;
try
Host:=inet_addr(PChar(Address));
PIerSize:=sizeof(TIcmpEchoReplyEx)+Size;
GetMem(PIer,PIerSize);
try
FillChar(PIer^.RawData,Size,"0");
PIer^.IcmpEchoReply.Data:=@PIer^.RawData;
PIer^.IcmpEchoReply.DataSize:=Size;
hIcmp:=IcmpCreateFile;
try
IcmpSendEcho(hIcmp,Host,@PIer^.RawData,Size,Nil,PIer,PIerSize,TimeOut);
result:=PIer^.IcmpEchoReply;
finally
IcmpCloseHandle(hIcmp);
end;
finally
FreeMem(PIer,PIerSize);
end;
finally
WSACleanup();
end;
end;
end.
это приделал:unit Unit2;
interface
uses
Windows,Classes,Icmp;
type
TPingCallback=procedure(Sender:TObject;const Host,Reply:string) of object;
TPingThread = class(TThread)
private
FHost,FReply:string;
FPingCallback:TPingCallback;
procedure DoPingCallback;
protected
procedure Execute; override;
public
constructor Create(CreateSuspended: Boolean;const Host:string;PingCallback:TPingCallback);
end;
implementation
{ TPingThread }
constructor TPingThread.Create(CreateSuspended: Boolean;
← →
Slym © (2008-08-05 05:23) [49]
const Host: string;PingCallback:TPingCallback);
begin
FHost:=Host;
FPingCallback:=PingCallback;
inherited Create(CreateSuspended);
end;
procedure TPingThread.DoPingCallback;
begin
if assigned(FPingCallback) then
FPingCallback(Self,FHost,FReply);
end;
procedure TPingThread.Execute;
begin
while not Terminated do
begin
FReply:=FormatIcmpEchoReply(IcmpEcho(FHost));
Synchronize(DoPingCallback);
Sleep(1000);
end;
end;
end.
так оно работает:type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
procedure PingCallback(Sender:TObject;const Host,Reply:string);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.PingCallback(Sender: TObject; const Host, Reply: string);
begin
Memo1.Lines.Add(Host+" = "+Reply);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
TPingThread.Create(false,"192.168.1.1",PingCallback);
TPingThread.Create(false,"192.168.1.2",PingCallback);
TPingThread.Create(false,"192.168.1.3",PingCallback);
end;
что еще нада? работу с потоками сам приделай
← →
DeeNamid © (2008-08-05 09:12) [50]
> Сергей М.
Ты помоему вообще не читаешь те темы в которых пишешь. Смотри выше там все написано. Там есть код, он такой синенький.
← →
DeeNamid © (2008-08-05 09:19) [51]
> Slym
Спасибо тебе, конкретный ответ. Попробую. Только почему через Win API будет работать, как ты говоришь, а с Indy не получается?
← →
Сергей М. © (2008-08-05 09:26) [52]
> DeeNamid © (05.08.08 09:12) [50]
> код, он такой синенький.
"Синенький" - это у Slym ©.
В нем не пахнет никакими КС, в отличие от твоего кода.
И не должно пахнуть, ибо КС тут нафих не нужны.
← →
Anatoly Podgoretsky © (2008-08-05 09:30) [53]> Сергей М. (05.08.2008 9:26:52) [52]
Поскольку КС защищен сам пинг, то программа сразу становится однопотоковой.
← →
DeeNamid © (2008-08-05 09:47) [54]
> Anatoly Podgoretsky
Ну да, вот тут и проблема, а если не защищать то получается ерунда
← →
Anatoly Podgoretsky © (2008-08-05 09:52) [55]> DeeNamid (05.08.2008 9:47:54) [54]
Так у тебя ошибки в реализации, потому и ерунда.
← →
DeeNamid © (2008-08-05 09:59) [56]
> Anatoly Podgoretsky
Покажи где. Два дня прошу людей - покажите мне мои ошибки.
← →
Anatoly Podgoretsky © (2008-08-05 10:08) [57]А всем лень в таком коде разбираться. Слишком много телепатии надо применять.
← →
DeeNamid © (2008-08-05 10:25) [58]
> Anatoly Podgoretsky
Елки-палки, да что там разбираться, 40 строк кода. Посмотри на 10-ый пост, там весь код написан.
← →
Anatoly Podgoretsky © (2008-08-05 10:28) [59]> DeeNamid (05.08.2008 10:25:58) [58]
А нафига мне столько раз смотреть?
Проси кого ни будь другого, кому не лень много раз смотреть.
← →
DeeNamid © (2008-08-05 10:39) [60]
> Anatoly Podgoretsky
А кому не лень? И зачем ты тогда говоришь что у меня ошибки в реализации, если не можешь на эти ошибки указать?
← →
Сергей М. © (2008-08-05 11:02) [61]
> Anatoly Podgoretsky © (05.08.08 09:30) [53]
Ты имеешь ввиду КС в потрохах самОй IcmpSendEcho ?
← →
Сергей М. © (2008-08-05 11:11) [62]
> покажите мне мои ошибки
Ты не учитываешь вот это:
SequenceID is a Word value used as a packet identifier for the Ping request. SequenceID is also used when decoding the response packets for a Ping request. When SequenceID contains a non-zero value, it is used to match an echo response to the original ping request with the same sequence identifer. SequenceID can be set to a unique value to identify a specific Ping request and/or response
Copyright © 1993-2006, Chad Z. Hower (aka Kudzu) and the Indy Pit Crew. All rights reserved.
← →
Anatoly Podgoretsky © (2008-08-05 11:12) [63]> DeeNamid (05.08.2008 10:39:00) [60]
Потому что у тебя программа не работает.
И с чего ты взял, что не могу, ты не путай не хочу с не могу.
← →
Anatoly Podgoretsky © (2008-08-05 11:13) [64]> Сергей М. (05.08.2008 11:02:01) [61]
Не из его кода
EnterCriticalSection(CS);
res:=ping_func(ip_addres);
LeaveCriticalSection(CS);
Вот это убивает многопоточность.
← →
Сергей М. © (2008-08-05 11:16) [65]
> Anatoly Podgoretsky © (05.08.08 11:13) [64]
Строки, управляющие КС, у него везде закомментарены.
Считаем, что он КС не использует.
← →
Anatoly Podgoretsky © (2008-08-05 11:32) [66]> Сергей М. (05.08.2008 11:16:05) [65]
Так считать не надо, он пишет, что если он раскомментирует эти строки, то у него почему то исчезает многопоточность. А когда комментирует, то у него возникает проблема с порчей переменных.
← →
DeeNamid © (2008-08-05 11:36) [67]
> Anatoly Podgoretsky © (05.08.08 11:32) [66]
Все ты правильно говоришь.
А скажите мне такую вещьicmp:=TIdIcmpClient.Create(nil);
здесь ведь наверно надо указать создателя компонента icmp?
← →
Сергей М. © (2008-08-05 11:40) [68]
> у него почему то исчезает многопоточность
Нет, он понимает, почему она исчезает.
Но не понимает, что icmp-запросы требуют уникальной идентификации секвенций.
В случае с IcmpSendEcho это требование, по всей видимости, обеспечивается неявно, в случае с индейскими ро-сокетами это нужно делать явно.
← →
Medbe}I{onok XML © (2008-08-05 11:40) [69]создатель - это ты
← →
Dennis I. Komarov © (2008-08-05 11:41) [70]> [67] DeeNamid © (05.08.08 11:36)
для чего?
← →
Anatoly Podgoretsky © (2008-08-05 11:42) [71]> DeeNamid (05.08.2008 11:36:07) [67]
Не обязательно, можно и nil, ведь все зависит от того, кто будет уничтожать компонент, будет ли где либо использоваться значение Owner.
Лично я так никогда не делаю, только Self, разумеется не по отношению к TIdIcmpClient, а ко всем компонентам.
← →
Сергей М. © (2008-08-05 11:45) [72]
> здесь ведь наверно надо указать создателя компонента
На суть "проблемы" это никак не влияет.
← →
Anatoly Podgoretsky © (2008-08-05 11:47) [73]> Сергей М. (05.08.2008 11:40:08) [68]
Я на индейцах давно поставил очень большой крест. А нас разные пути, я по своей дороге иду, а индейцы по своей. И разбираться с ихним монстром и конкретными функциями у меня нет никакого желания, тем более, что чем дальше, тем больше монстр становится. Кажется уже и авторы сами не понимают, как это вообще работает.
← →
DeeNamid © (2008-08-05 11:49) [74]
> Сергей М. © (05.08.08 11:40) [68]
> icmp-запросы требуют уникальной идентификации секвенций.
от есть я пишу так:icmp.Ping("",0);
где вместо 0 я должен ставить уникальный идентификатор? какой?
← →
DeeNamid © (2008-08-05 11:51) [75]
> Anatoly Podgoretsky © (05.08.08 11:47) [73]
и это говорит человек который переводил "IndyInDepth". :D
Что советуешь, использовать WinAPI или что-то другое?
← →
Medbe}I{onok XML © (2008-08-05 11:54) [76]и это говорит человек который переводил "IndyInDepth". :D
Там по ходу промпт поработал.
← →
Сергей М. © (2008-08-05 11:58) [77]
> какой?
Генератор уникальных идентификаторов секвенций нужно реализовать.
Вот его-то в условиях много поточности как раз и следует защитить КС)
А защита метода Ping() как такового нафиг не нужна)
← →
DeeNamid © (2008-08-05 12:03) [78]
> Сергей М. © (05.08.08 11:58) [77]
Что-то как-то сложновато ты высказался. уникальных идентификаторов секвенций это как сделать? я сейчас попробовал сделатьicmp.Ping("",i);
, где i - номер потока. Получились немного другие результаты, но все равно чушь. Например он явно неработающий IP-шник пинговал как работающий.
← →
Сергей М. © (2008-08-05 12:06) [79]
> где i - номер потока
Да не номер потока, а уникальный номер запроса !
Вот для этого и нужен генератор)
← →
Сергей М. © (2008-08-05 12:07) [80]Секвенция - это дейтаграмма запроса и ответная дейтаграмма на этот запрос.
Страницы: 1 2 3 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.09.14;
Скачать: [xml.tar.bz2];
Память: 0.64 MB
Время: 0.053 c