Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1216620114
Vlad Oshin
2008-07-21 10:01
2008.09.14
Постоянно в памяти висит процесс WinWord.exe


3-1205563988
Виталий Панасенко(дом)
2008-03-15 09:53
2008.09.14
FR 3.2/End-User отчет/передача параметра подключения


15-1216957269
Slider007
2008-07-25 07:41
2008.09.14
С днем рождения ! 25 июля 2008 пятница


4-1196190355
DevilDevil
2007-11-27 22:05
2008.09.14
Схватить форму/отпустить форму. Помогите, пожалуйста.


3-1205828294
Гость-1734
2008-03-18 11:18
2008.09.14
постоянная ошибка с msdart.dll





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский