Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.10.24;
Скачать: [xml.tar.bz2];

Вниз

как правильнее составить цикл?   Найти похожие ветки 

 
linuxoid   (2010-07-26 08:26) [0]

Здравствуйте!

Имеется код программы(параллельный поток), которая пингует хост. теперь нужно сделать так, чтобы адреса хостов она вытаскивала из базы. как теперь это организовать в цикле?

unit thrd;

interface

uses
 Windows,  SysUtils,  Classes,
 StdCtrls, winsock;

type
 TThreadScan = class(TThread)
 private
 msg,msg2: string;
 procedure addstr;
   { Private declarations }
 protected
   procedure Execute; override;
 end;

 type
   ip_option_information = packed record  // Информация заголовка IP (Наполнение
       // этой структуры и формат полей описан в RFC791.
       Ttl : byte;   // Время жизни (используется traceroute-ом)
       Tos : byte;   // Тип обслуживания, обычно 0
       Flags : byte;  // Флаги заголовка IP, обычно 0
       OptionsSize : byte;  // Размер данных в заголовке, обычно 0, максимум 40
       OptionsData : Pointer; // Указатель на данные
   end;

  icmp_echo_reply = packed record
       Address : u_long;        // Адрес отвечающего
       Status : u_long;       // IP_STATUS (см. ниже)
       RTTime : u_long;       // Время между эхо-запросом и эхо-ответом
            // в миллисекундах
       DataSize : u_short;        // Размер возвращенных данных
       Reserved : u_short;        // Зарезервировано
       Data : Pointer;    // Указатель на возвращенные данные
       Options : ip_option_information; // Информация из заголовка IP
   end;

   PIPINFO = ^ip_option_information;
   PVOID = Pointer;

       function IcmpCreateFile() : THandle; stdcall; external "ICMP.DLL" name "IcmpCreateFile";
       function IcmpCloseHandle(IcmpHandle : THandle) : BOOL; stdcall; external "ICMP.DLL"  name "IcmpCloseHandle";
       function IcmpSendEcho(
                         IcmpHandle : THandle;    // handle, возвращенный IcmpCreateFile()
                         DestAddress : u_long;    // Адрес получателя (в сетевом порядке)
                         RequestData : PVOID;     // Указатель на посылаемые данные
                         RequestSize : Word;      // Размер посылаемых данных
                         RequestOptns : PIPINFO;  // Указатель на посылаемую структуру
                                           // ip_option_information (может быть nil)
                         ReplyBuffer : PVOID;     // Указатель на буфер, содержащий ответы.
                         ReplySize : DWORD;       // Размер буфера ответов
                         Timeout : DWORD          // Время ожидания ответа в миллисекундах
                        ) : DWORD; stdcall; external "ICMP.DLL" name "IcmpSendEcho";

implementation

uses Unit1;

procedure TThreadScan.addstr;
begin
Form1.ListBox1.Items.Add(msg);
end;

procedure TThreadScan.Execute;
var
  hIP : THandle;
   pingBuffer : array [0..31] of Char;
   pIpe : ^icmp_echo_reply;
   pHostEn : PHostEnt;
   wVersionRequested : WORD;
   lwsaData : WSAData;
   error : DWORD;
   destAddress : In_Addr;
   i, count:integer;
   //adress : array [1..30] of pansichar;
   IPReply: string;
begin
  // Создаем handle
   hIP := IcmpCreateFile();

   GetMem( pIpe,
           sizeof(icmp_echo_reply) + sizeof(pingBuffer));
   pIpe.Data := @pingBuffer;
   pIpe.DataSize := sizeof(pingBuffer);

   wVersionRequested := MakeWord(1,1);
   error := WSAStartup(wVersionRequested,lwsaData);

  // начало цикла
pHostEn := gethostbyname(adress[i]);
    destAddress := PInAddr(pHostEn^.h_addr_list^)^;

   IcmpSendEcho(hIP,
                destAddress.S_addr,
                @pingBuffer,
                sizeof(pingBuffer),
                Nil,
                pIpe,
                sizeof(icmp_echo_reply) + sizeof(pingBuffer),
                100);

   error := GetLastError();
   if (error <> 0) then
   begin

        msg:=(adress[i]+"  N/A");
      synchronize(addstr);
        //continue;
   end else begin

   msg:=(adress[i]+"  Reply time: "+IntToStr(pIpe.RTTime)+" ms");
   synchronize(addstr);
   end;

//конец цикла
   IcmpCloseHandle(hIP);
   WSACleanup();
   FreeMem(pIpe);

end;

end.


 
Юрий Зотов ©   (2010-07-26 08:53) [1]

with Query do
begin
 Text := "select IP from ... where ...";
 Open;
 while not EoF do
   пинг(FieldByName(IP).As...)
end;


 
linuxoid   (2010-07-26 09:07) [2]

и еще вопрос? у меня процесс постоянен и закинут в таймер и пингует через определенный интервал.
а если я буду добавлять новые хосты в базу, программа будет их тоже в процессе пинговать?


 
Anatoly Podgoretsky ©   (2010-07-26 09:17) [3]

// начало цикла
//конец цикла

Здесь нет цикла.


 
linuxoid   (2010-07-26 09:31) [4]


> Здесь нет цикла.


вот и я хочу чтоб, то что там написано внутри цикла...


 
Anatoly Podgoretsky ©   (2010-07-26 10:01) [5]

> linuxoid  (26.07.2010 09:31:04)  [4]

Поскольку это поток, то там цикл не нужен. Он должен быть внешним.


 
linuxoid   (2010-07-26 10:04) [6]


> Поскольку это поток, то там цикл не нужен. Он должен быть
> внешним.


я так понял, значит цикл надо организовать здесь?

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Application.Processmessages;
new1 := TThreadScan.create(true);
new1.freeonterminate := true;
new1.resume;
end;


 
Anatoly Podgoretsky ©   (2010-07-26 10:24) [7]

> linuxoid  (26.07.2010 10:04:06)  [6]

Именно здесь и передавать параметры для пинга одного дареса в поток.


 
linuxoid   (2010-07-26 10:52) [8]


> Именно здесь и передавать параметры для пинга одного дареса
> в поток.


адреса хостов находятся у меня в базе. и их предостаточно.
мне нужно же это как-то организовать в цикле.

form1.table.Open;
while not form1.table.Eof do begin
adress:=pchar(form1.table.FieldByName("nodeip").AsString);
Application.Processmessages;
new1 := TThreadScan.create(true);
new1.freeonterminate := true;
new1.resume;
end;
end;

примерно так оно должно выглядить?


 
Anatoly Podgoretsky ©   (2010-07-26 11:17) [9]

> linuxoid  (26.07.2010 10:52:08)  [8]

new1.freeonterminate := true;
// вот здесь извлечение из базы и передача в поток.
new1.resume;


 
linuxoid   (2010-07-26 11:47) [10]


> // вот здесь извлечение из базы и передача в поток.


а как правильнее сделать?

с этим циклом у мения не получается...
form1.table.Open;
form1.table.First;
for i:=1 to form1.table.RecordCount do begin
adress[i]:=pchar(form1.table.Fields.FieldByName("nodeip").AsString);
form1.table.Next;
end;


 
Dennis I. Komarov ©   (2010-07-26 11:55) [11]

Ща тебя расстреляють за такое...


 
Anatoly Podgoretsky ©   (2010-07-26 12:00) [12]

А с этим циклом и не надо, ведь уже есть правильный цикл
while not form1.table.Eof do begin


 
linuxoid   (2010-07-26 12:05) [13]


> Ща тебя расстреляють за такое...

))) я в этом деле еще новичок


 
linuxoid   (2010-07-26 12:10) [14]


> А с этим циклом и не надо, ведь уже есть правильный цикл
> while not form1.table.Eof do begin


begin
form1.table.Open;
form1.table.First;
i:=1;
while not form1.table.Eof do begin
adress[i]:=pchar(form1.table.Fields.FieldByName("nodeip").AsString);
listbox1.Items.Add(adress[i]);
form1.table.Next;
end;
end;

вот примерное такое?


 
Anatoly Podgoretsky ©   (2010-07-26 12:16) [15]

> linuxoid  (26.07.2010 12:10:14)  [14]

Непонятно, что такое adress[i] и зачем оно нужно. Что тут делает PChar,
зачем данные в цикле пишутся в adress[1] - это конечно не ошибка, это просто
абсурд. Где здесь поток, куда он пропал?


 
Anatoly Podgoretsky ©   (2010-07-26 12:17) [16]

> linuxoid  (26.07.2010 12:05:13)  [13]

Не льсти себе, тебе еще до новичка далеко.


 
linuxoid   (2010-07-26 12:27) [17]

procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin
Application.Processmessages;
new1 := TThreadScan.create(true);
new1.freeonterminate := true;
form1.table.Open;
form1.table.First;
while not form1.table.Eof do begin
adress:=form1.table.Fields.FieldByName("nodeip").AsString;
form1.table.Next;
end;
new1.resume;
end;


 
linuxoid   (2010-07-26 12:28) [18]

в этом случае он пингует только один хост.


 
brother ©   (2010-07-26 12:38) [19]

где в коде вызов пинга вообще?


 
brother ©   (2010-07-26 12:40) [20]

а понял.
и где описано: adress?
как оно попадет в поток?


 
brother ©   (2010-07-26 12:41) [21]

я еще раз тебе советую: раз ты в начинающих - используй мой код на таймере сделаный...


 
linuxoid   (2010-07-26 12:46) [22]


> где в коде вызов пинга вообще?


вызываю поток.
new1.resume;


 
linuxoid   (2010-07-26 12:48) [23]


> и где описано: adress?
> как оно попадет в поток?


вот с этим мне надо разобраться


 
brother ©   (2010-07-26 12:49) [24]

я бы в конструкторе, добавил еще один параметр...


 
Anatoly Podgoretsky ©   (2010-07-26 12:51) [25]

> linuxoid  (26.07.2010 12:27:17)  [17]

Теперь все это в цикле


 
linuxoid   (2010-07-26 12:52) [26]

procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin
Application.Processmessages;
new1 := TThreadScan.create(true);
new1.freeonterminate := true;
form1.table.Open;
form1.table.First;
while not form1.table.Eof do begin
adress:=form1.table.Fields.FieldByName("nodeip").AsString;
form1.table.Next;
end;
new1.resume;
end;

здесь он передает токо один хост


 
brother ©   (2010-07-26 12:52) [27]

> Теперь все это в цикле

согласен на сабж ответили)


 
Anatoly Podgoretsky ©   (2010-07-26 12:54) [28]

> brother  (26.07.2010 12:40:20)  [20]

А также new1 и неизвестно какой form1 используется
Вот я и говорю, что до начинающих еще далеко. Пока идет бездумный перебор
кодовых кусков.


 
linuxoid   (2010-07-26 12:54) [29]


> Теперь все это в цикле


а какие должны быть параметры цикла?


 
brother ©   (2010-07-26 12:56) [30]

перекрывай конструктор TThread, добавляй еще один параметр, при создании будешь подсовывать конструктору адресс, и он будет стартовать с нужным адресом...
зы ты так и не ответил, где описана    //adress : array [1..30] of pansichar;


 
brother ©   (2010-07-26 12:56) [31]

> Вот я и говорю, что до начинающих еще далеко. Пока идет
> бездумный перебор

согласен, чет надоело уже... учи мат часть!


 
Anatoly Podgoretsky ©   (2010-07-26 13:00) [32]

> linuxoid  (26.07.2010 12:54:29)  [29]

А про какой цикл спрашиваешь?


 
Anatoly Podgoretsky ©   (2010-07-26 13:00) [33]

> brother  (26.07.2010 12:56:30)  [30]

Совсем не обязательно, можно присвоить свойству/члену без всякого
перекрытия.


 
linuxoid   (2010-07-26 13:00) [34]


> зы ты так и не ответил, где описана    //adress : array
> [1..30] of pansichar;

это я исползовал вначале, када использовал обычный цикл.


 
linuxoid   (2010-07-26 13:03) [35]


> А про какой цикл спрашиваешь?


Anatoly Podgoretsky ©   (26.07.10 12:51) [25]

> linuxoid  (26.07.2010 12:27:17)  [17]

Теперь все это в цикле


 
brother ©   (2010-07-26 13:03) [36]

> можно присвоить свойству/члену без всякого
> перекрытия.

можно, чет в "не те степи" меня прет)


 
Anatoly Podgoretsky ©   (2010-07-26 13:21) [37]

> brother  (26.07.2010 13:03:36)  [36]

Пытаешься сложно делать, а ты отнесись как к обычному классу, со своими
членами и свойтвами, я за свойство, но Линуксоид погибнет с ними, пусть
делает обычного public члена класса.


 
linuxoid   (2010-07-26 13:26) [38]


> Anatoly Podgoretsky ©   (26.07.10 13:21) [37]


но все же как мне быть с этим. как поступить с этим циклом?


 
Anatoly Podgoretsky ©   (2010-07-26 13:39) [39]

> linuxoid  (26.07.2010 13:26:38)  [38]

Тебе столько написали, что ты уже должен был сделать сразу несколькими
путями.


 
linuxoid   (2010-07-26 13:42) [40]


> Тебе столько написали, что ты уже должен был сделать сразу
> несколькими
> путями.


можете наглядный алгоритм написать. пытаюсь но что то у мя выходит


 
Anatoly Podgoretsky ©   (2010-07-26 13:52) [41]

Вроде уже в самом начале ЮЗ представил алгоритм в виде кода.

1. Проход по базе, от начала до конца;
2. Выборка ИП для пинга из базы;
3. Вызов пинга (в потоке или последовательно);
4. переход к следующей иттерации.


Каждый кусок по отдельности уже фигурировал, собирай в целое. Это запускать внутри цикла таймера.


 
linuxoid   (2010-07-26 14:11) [42]


>
> Каждый кусок по отдельности уже фигурировал, собирай в целое.
>  Это запускать внутри цикла таймера.


procedure TForm1.Timer1Timer(Sender: TObject);

begin
Application.Processmessages;
new1 := TThreadScan.create(true);
new1.freeonterminate := true;
form1.table.Open;
form1.table.First;
while not form1.table.Eof do begin
adress:=pchar(form1.table.Fields.FieldByName("nodeip").AsString);
new1.resume;
form1.table.Next;
end;
end;

вот собрал. но здесь он по циклу не проходит. берет только последнее значение из базы.


 
Anatoly Podgoretsky ©   (2010-07-26 14:45) [43]

> linuxoid  (26.07.2010 14:11:42)  [42]

Как будто ничего не говорили, не проходит по циклу, поскольку это у тебя вне
цикла.


 
linuxoid   (2010-07-26 14:51) [44]


>
> Как будто ничего не говорили, не проходит по циклу, поскольку
> это у тебя вне
> цикла.


а как теперь тада передать данные в поток в цикле?


 
Anatoly Podgoretsky ©   (2010-07-26 14:53) [45]

> linuxoid  (26.07.2010 14:51:44)  [44]

Поток.поле := значение
Поток.свойство := значение


 
linuxoid   (2010-07-26 15:07) [46]


> Поток.поле := значение
> Поток.свойство := значение


а как это будет в коде выглядить?


 
Dennis I. Komarov ©   (2010-07-26 15:12) [47]

new1.adrees:=Dataset.FieldByName("adress").AsString;


 
linuxoid   (2010-07-26 15:22) [48]


> > Поток.свойство := значение


какое свойство должно описываться?


 
Юрий Зотов ©   (2010-07-26 15:35) [49]


> linuxoid   (26.07.10 15:22) [48]

Может быть, прежде, чем заниматься объектно-ориентированным программированием в Delphi, есть смысл прочитать хотя бы одну книжку по нему?

Можете поверить - даже самая простая книга, даже уровня "для начинающих" сняла бы у Вас огромную кучу вопросов и сэкономила бы массу времени.


 
Anatoly Podgoretsky ©   (2010-07-26 15:46) [50]

> linuxoid  (26.07.2010 15:07:46)  [46]

Так и будет выглядеть, только замени на английский


 
Anatoly Podgoretsky ©   (2010-07-26 15:47) [51]

> linuxoid  (26.07.2010 15:22:48)  [48]

Я тебе уже говорил, не лезь во свойства, тебе это тяжело, используй поля


 
sniknik ©   (2010-07-26 15:51) [52]

> Можете поверить - даже самая простая книга, даже уровня "для начинающих" сняла бы у Вас огромную кучу вопросов и сэкономила бы массу времени.
и опять, почти дословно, тот же совет ему дают ... "а воз и нынче там" ;)


 
linuxoid   (2010-07-26 16:02) [53]

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Application.Processmessages;
form1.table.Open;
form1.table.First;
while not form1.table.Eof do begin
new1 := TThreadScan.create(true);
new1.freeonterminate := true;
new1.adress:=pchar(form1.table.Fields.FieldByName("nodeip").AsString);
new1.Resume;
form1.table.Next;
end;
end;

вот попробовал сделать так. работает около 5 минит затем выскакивает сообщение с ошибкой "access violation at address 06783007 in module "bordbk70.dll". read of address 0b880000";


 
Dennis I. Komarov ©   (2010-07-26 16:11) [54]


> linuxoid   (26.07.10 16:02) [53]

Значит у тебя ошибка в программе...


 
linuxoid   (2010-07-26 16:32) [55]


> > linuxoid   (26.07.10 16:02) [53]
>
> Значит у тебя ошибка в программе...


а какая может быть ошибка и тем более возникает через минут 5?


 
Юрий Зотов ©   (2010-07-26 16:35) [56]

Это срабатывает внутренний таймер VCL.


 
linuxoid   (2010-07-26 16:39) [57]

чтобы исправить эту ошибку нужно что-то дописать или в коде исправить какие то моменты?


 
Dennis I. Komarov ©   (2010-07-26 17:14) [58]

Чтобы работать с потоками надо понимать их... а ты пишешь не понимая того, что пишешь...


 
Anatoly Podgoretsky ©   (2010-07-26 20:18) [59]


> linuxoid   (26.07.10 16:02) [53]

Тебя уже спрашивали про эти странные переменные

form1
new1

Ты же никаких выводов из этого не сделал.


 
linuxoid   (2010-07-27 08:23) [60]

вот два листинга программы.

main

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, thrd, DB, ADODB, ExtCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   conn: TADOConnection;
   table: TADOTable;
   tablenodeid: TAutoIncField;
   tableparentid: TIntegerField;
   tablenodename: TWideStringField;
   tablenodetype: TIntegerField;
   tablenodeip: TWideStringField;
   tablenodeother: TWideStringField;
   Timer1: TTimer;
   ListBox1: TListBox;
   dstable: TDataSource;
   Button2: TButton;

   procedure FormCreate(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
 private
   { Private declarations }
 public
 new1:TThreadScan;
 hThread:array of array of Cardinal;

   { Public declarations }
 end;

var
 Form1: TForm1;

   //adress: array [1..30] of pansichar;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin
table.Open;
table.First;
while not form1.table.Eof do begin
Application.Processmessages;
new1 := TThreadScan.create(true);
new1.freeonterminate := true;
new1.adress:=pchar(form1.table.Fields.FieldByName("nodeip").AsString);
new1.Resume;
table.Next;
end;
end;
end.


 
linuxoid   (2010-07-27 08:26) [61]

это второй листинг.
thrd

unit thrd;

interface

uses
 Windows,  SysUtils,  Classes,
 StdCtrls, winsock;

type
 TThreadScan = class(TThread)
 adress: string;
 private

 msg: string;
 procedure addstr;
   { Private declarations }
 protected
   procedure Execute; override;
 end;

 type
   ip_option_information = packed record
       Ttl : byte;  
       Tos : byte;  
       Flags : byte;  
       OptionsSize : byte;  
       OptionsData : Pointer;
   end;

  icmp_echo_reply = packed record
       Address : u_long;      
       Status : u_long;      
       RTTime : u_long;      
           
       DataSize : u_short;        
       Reserved : u_short;      
       Data : Pointer;    
       Options : ip_option_information;
   end;

   PIPINFO = ^ip_option_information;
   PVOID = Pointer;

       function IcmpCreateFile() : THandle; stdcall; external "ICMP.DLL" name "IcmpCreateFile";
       function IcmpCloseHandle(IcmpHandle : THandle) : BOOL; stdcall; external "ICMP.DLL"  name "IcmpCloseHandle";
       function IcmpSendEcho(
                         IcmpHandle : THandle;    
                         DestAddress : u_long;    
                         RequestData : PVOID;    
                         RequestSize : Word;      
                         RequestOptns : PIPINFO;  
                                           
                         ReplyBuffer : PVOID;  
                         ReplySize : DWORD;      
                         Timeout : DWORD          
                        ) : DWORD; stdcall; external "ICMP.DLL" name "IcmpSendEcho";

implementation

uses Unit1;

procedure TThreadScan.addstr;
begin
Form1.ListBox1.Items.Add(msg);
end;

procedure TThreadScan.Execute;
var
  hIP : THandle;
   pingBuffer : array [0..31] of Char;
   pIpe : ^icmp_echo_reply;
   pHostEn : PHostEnt;
   wVersionRequested : WORD;
   lwsaData : WSAData;
   error : DWORD;
   destAddress : In_Addr;
    i:integer;
   IPReply: string;

begin
  // &#209;&#238;&#231;&#228;&#224;&#229;&#236; handle
   hIP := IcmpCreateFile();

   GetMem( pIpe,
           sizeof(icmp_echo_reply) + sizeof(pingBuffer));
   pIpe.Data := @pingBuffer;
   pIpe.DataSize := sizeof(pingBuffer);

   wVersionRequested := MakeWord(1,1);
   error := WSAStartup(wVersionRequested,lwsaData);

pHostEn := gethostbyname(pchar(adress));
    destAddress := PInAddr(pHostEn^.h_addr_list^)^;

   IcmpSendEcho(hIP,
                destAddress.S_addr,
                @pingBuffer,
                sizeof(pingBuffer),
                Nil,
                pIpe,
                sizeof(icmp_echo_reply) + sizeof(pingBuffer),
                100);

   error := GetLastError();
    IPReply:=("Reply from "+
                IntToStr(LoByte(LoWord(pIpe^.Address)))+"."+
               IntToStr(HiByte(LoWord(pIpe^.Address)))+"."+
               IntToStr(LoByte(HiWord(pIpe^.Address)))+"."+
               IntToStr(HiByte(HiWord(pIpe^.Address))));
   if (error <> 0) then
   begin
     
        msg:=(IPReply+"  N/A");
       synchronize(addstr);
        exit;
   end;

   msg:=(IPReply+"Reply time: "+IntToStr(pIpe.RTTime)+" ms");
   synchronize(addstr);

   IcmpCloseHandle(hIP);
   WSACleanup();
   FreeMem(pIpe);

end;

end.


 
Dennis I. Komarov ©   (2010-07-27 15:43) [62]


> вот два листинга программы.

и нафига они нам?


> procedure TThreadScan.addstr;
> begin
> Form1.ListBox1.Items.Add(msg);
> end;

И откуда такое чудо вычитано?


 
Плохиш ©   (2010-07-28 01:17) [63]


> linuxoid   (27.07.10 08:23) [60]
>
> вот два листинга программы.

Не вижу листингов, только маразматические испражнения...


 
Германн ©   (2010-07-28 01:50) [64]


> Плохиш ©   (28.07.10 01:17) [63]
>
>

Я уже давно плюнул на эти испражнения.


 
Anatoly Podgoretsky ©   (2010-07-28 08:38) [65]

> Плохиш  (28.07.2010 01:17:03)  [63]

А нафига тебе листинги без вопросов?



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.10.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.64 MB
Время: 0.006 c
2-1280816013
harsik
2010-08-03 10:13
2010.10.24
При пустом значении для поля вида Lookup


6-1227962984
dmitry_12_08_73
2008-11-29 15:49
2010.10.24
Выбор способа передачи данных с помощью протокола HTTP


6-1228000045
Pall
2008-11-30 02:07
2010.10.24
tcp сервер


15-1279257737
Ega23
2010-07-16 09:22
2010.10.24
Прювет из Крыма


15-1279538234
Kerk
2010-07-19 15:17
2010.10.24
WinXP &amp; keyboard layout





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский