Модераторы: Snowy, Poseidon, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сканирование подсети на наличие порта 
:(
    Опции темы
Calypso
  Дата 30.6.2004, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 30.6.2004

Репутация: нет
Всего: нет



smile Нарооод!!!!!! Помогитееееееееее!!!!!!!!!!
Я сделал сетевую прогу-сервер и прогу-клиент с помощью компонентов ServerSocket и ClientSocket, но вот беда: призапуске клиента необходимо вручную вводить ИП-адрес хоста где запущен сервер. Как сделать чтобы клиент сам сканировал сеть и определял наличие сервера. Я тупо делаю так:
Код
ClientSocket1.Port:=1212;
    for J:=1 to 250 do begin
     try
      ClientSocket1.Close;
      ClientSocket1.Address:='192.168.22.'+ IntToStr(j);
      ClientSocket1.Open;
     except
      continue;
     end;
     break;
    end;

Но этот процесс растягивается на 10 минут.
Помогите, кто разбирается никто реально ничего не подсказывает....буду благодарен smile

Это сообщение отредактировал(а) p0s0l - 28.9.2005, 15:30
PM MAIL   Вверх
Girder
Дата 30.6.2004, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 4
Всего: 155



Попробуй послать широковешательный пакет с запросом.
А на сервере обработай и ответь клиенту.


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Akella
Дата 30.6.2004, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



напрашивается ворос: как послать широковещательный пакет с запросом?

PM MAIL   Вверх
Guest
Дата 30.6.2004, 15:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Посылаешь пакет на адрес xxx.xxx.xxx.255. Если сетка класса "C".
Например, в твоей сети адреса машин начинаются с 192.168.222.ххх вот и отправляешь на 192.168.222.255. Поэкспериментируй с netsend-ом. Если есть такие службы на компах в сети, то они все получат твое сообщение.
  Вверх
Girder
Дата 30.6.2004, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 4
Всего: 155



Цитата
как послать широковещательный пакет с запросом?

Обшибся малость rolleyes.gif : Необходимо послать широковещательное(UDP по адрессу 255:255:255:255) сообщение и связываться с теми узлами, которые распознали это сообщение и прислали на него соответствующий ответ.

Это сообщение отредактировал(а) Girder - 30.6.2004, 15:10


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Гость_Unregistered
Дата 30.6.2004, 16:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Как так обшибся? Все должно работать. Попробуй. smile.gif
  Вверх
Girder
Дата 30.6.2004, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 4
Всего: 155



Да это я не тебе,а dsergey. Просто когда я писал ответ(отвлекли на работе малость rolleyes.gif ), ты уже запостил ответ.
Как ты написал тоже можно.

Это сообщение отредактировал(а) Girder - 30.6.2004, 16:50


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Akella
Дата 1.7.2004, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



Цитата
Но этот процесс растягивается на 10 минут.

мне здаётся, что это нормально. Сканеры так и работают.
PM MAIL   Вверх
Гость_Unregistered
Дата 1.7.2004, 16:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











dsergey, не надо путать попу с пальцем smile.gif он ведь не сканер пишет. а для сканера - 10 мин. далеко не предел.
  Вверх
Akella
Дата 2.7.2004, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



Цитата
dsergey, не надо путать попу с пальцем  он ведь не сканер пишет. а для сканера - 10 мин. далеко не предел.




Цитата
Как сделать чтобы клиент сам сканировал сеть

PM MAIL   Вверх
Calypso
Дата 2.7.2004, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 30.6.2004

Репутация: нет
Всего: нет



Цитата
Посылаешь пакет на адрес xxx.xxx.xxx.255. Если сетка класса "C".

У меня так не получается. Как я понял сделать надо так:
Код
tcpClient.SendBuf(....);
Но перед этим необходимо
Код

TcpClient.remotehost:='192.168.22.255';
TcpClient.Open;

И ни к чему он не подключается, а следовательно нельзя послать пакет.....
Конечно я чего-то недопонимаю. Возникла мысль:
А что если подконнект осуществлять не по одному адресу, а сразу по нескольким с помощью нескольких компонентов. Но вот задача: на строке TcpClient.Open; или ClientSocket.Open или UdpSocket.Open; процесс останавливается и весь параллелизм сводится к нулю. Я чтото слыхал про параллельное программирование, может это и есть выход, но как запустить несколько взаимодействующих процессов из проги....................

Это сообщение отредактировал(а) Calypso - 2.7.2004, 09:33
PM MAIL   Вверх
Girder
Дата 2.7.2004, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 4
Всего: 155



File->New->Application
Бросаеш на форму три кнопки и memo
Имена кнопок bSendTo,bStartUDPServer,bStopUDPServer и подцепляеш к ним(OnClick) обработчики

Заменяеш модуль на следующий:
Код
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, WinSock;

type
TAddrServer = class(TThread)
 private
  ClientAddr:TSockAddrIn;
  BufFromClient:array [0..1023] of char;
 protected
   procedure GetAdd;
   procedure Execute;override;
 end;

type
 TForm1 = class(TForm)
   bSendTo: TButton;
   bStartUDPServer: TButton;
   bStopUDPServer: TButton;
   Memo1: TMemo;
   procedure bSendToClick(Sender: TObject);
   procedure bStartUDPServerClick(Sender: TObject);
   procedure bStopUDPServerClick(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 PortServer:Word=1212;
 SockServer:TSocket;
 InitServer:TWSAData;
 LocalAddr:TSockAddrIn;
 GetAddrServer:TAddrServer;

implementation

{$R *.dfm}

procedure TAddrServer.Execute;
begin
while not(Terminated) do GetAdd; // обшибся: было Synchronize(GetAdd);
end;

procedure TAddrServer.GetAdd;
var BufSize:Integer;
   SizeClient:Integer;
   ClientHost:PHostEnt;
   cAddr:PAnsiChar;
   cPort:Word;
   i:integer;
   p:pointer;
begin
FillChar(ClientAddr.sin_zero,SizeOf(ClientAddr.sin_zero),#0);
SizeClient:=SizeOf(ClientAddr);
BufSize:=RecvFrom(SockServer,BufFromClient,SizeOf(BufFromClient),0,ClientAddr,SizeClient);
if BufSize=Socket_Error then
 begin
  {Form1.Memo1.Lines.Add('******************');
  Form1.Memo1.Lines.Add('RecvFrom error: '+IntToStr(WSAGetLastError()));
  Form1.Memo1.Lines.Add('******************');}
  exit;
 end;
if BufSize>0 then
 begin
  BufFromClient[BufSize]:=#0;
  if AnsiCompareText('GetAddrServer',BufFromClient)=0 then
   begin
    Form1.Memo1.Lines.Add('******************');
    Form1.Memo1.Lines.Add('Принял дейтаграмму');
    p:[email protected]_addr;
    ClientHost:=GetHostByAddr(p,4,PF_INET);
    Form1.Memo1.Lines.Add('Сообщение: '+BufFromClient);
    if ClientHost<>nil then
     begin
      Form1.Memo1.Lines.Add('Name: '+ClientHost.h_name);
      cAddr:=inet_ntoa(ClientAddr.sin_addr);
      cPort:=ntohs(ClientAddr.sin_port);
      Form1.Memo1.Lines.Add('Host: '+cAddr+' Port: '+IntToStr(cPort));
      //Заполняем BufFromClient что хотим дать в ответе и отсылаем ответ
      i:=SendTo(SockServer,BufFromClient,SizeOf(BufFromClient),0,ClientAddr,SizeOf(ClientAddr));
      if i=Socket_Error then Form1.Memo1.Lines.Add('Не смог ответить клиенту!');
     end else Form1.Memo1.Lines.Add('Unknown host');
    Form1.Memo1.Lines.Add('******************');
   end;
 end;
end;

procedure TForm1.bSendToClick(Sender: TObject);
//Посылка широковещательного UDP пакета
var Init: TWSAData;
   SockOpt: BOOL;
   Sock: TSocket;
   Target: TSockAddrIn;
   i:Integer;
   SendBuf:array [0..1023] of char;
   SizeServer:Integer;
   ServerHost:PHostEnt;
   sAddr:PAnsiChar;
   sPort:Word;
   p:pointer;
begin
 if WSAStartup($101,Init)=0 then
  begin
   Sock:=Socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
   if Sock<>INVALID_SOCKET then
    begin
     FillChar(SendBuf,SizeOf(SendBuf),#0);
     SendBuf:='GetAddrServer'; //типо пароля
     SockOpt:=TRUE;
     if SetSockOpt(Sock,SOL_SOCKET,SO_BROADCAST, PChar(@SockOpt),SizeOf(SockOpt))<>SOCKET_ERROR then
      begin
       Target.sin_port:=htons(PortServer); //Порт сервера
       Target.sin_addr.S_addr:=INADDR_BROADCAST; //255.255.255.255
       Target.sa_family:=AF_INET;
       i:=SendTo(Sock,SendBuf,SizeOf(SendBuf),0,Target,SizeOf(Target));
       if i=Socket_Error then ShowMessage('Не смог послать!') else
        begin
         //Ждем ответ от сервера. Лудше вынести в отдельный поток
         FillChar(SendBuf,SizeOf(SendBuf),#0);
         SizeServer:=SizeOf(Target);
         repeat
          FillChar(Target.sin_zero,SizeOf(Target.sin_zero),#0);
          i:=RecvFrom(Sock,SendBuf,SizeOf(SendBuf),0,Target,SizeServer);
         until (i>=0);
         //Можно проверить SendBuf и если от сервера то Все Ок! Но это ты сам.
         p:[email protected]_addr;
         ServerHost:=GetHostByAddr(p,4,PF_INET);
         if ServerHost<>nil then
          begin
           sAddr:=inet_ntoa(Target.sin_addr);
           sPort:=ntohs(Target.sin_port);
           Form1.Caption:='Host Server: '+sAddr+' Port Server: '+IntToStr(sPort);
          end;
        end;
      end;
     CloseSocket(Sock);
    end;
   WSACleanup;
  end;
end;

procedure TForm1.bStartUDPServerClick(Sender: TObject);
begin
if WSAStartup($101,InitServer)<>0 then
 begin
  ShowMessage('WSAStartup error: '+IntToStr(WSAGetLastError()));
  exit;
 end;
SockServer:=socket(PF_Inet,SOCK_DGRAM,0);
if SockServer=INVALID_SOCKET then
 begin
  ShowMessage('Socket error: '+IntToStr(WSAGetLastError()));
  WSACleanup;
  exit;
 end;
LocalAddr.sa_family:=PF_Inet;
LocalAddr.sin_addr.S_addr:=INADDR_ANY;
LocalAddr.sin_port:=htons(PortServer);
FillChar(LocalAddr.sin_zero,SizeOf(LocalAddr.sin_zero),0);
if bind(SockServer,LocalAddr,SizeOf(LocalAddr))=Socket_Error then
 begin
  ShowMessage('Bind error: '+IntToStr(WSAGetLastError()));
  CloseSocket(SockServer);
  WSACleanup();
  exit;
 end;
Memo1.Clear;
GetAddrServer:=TAddrServer.Create(True);
GetAddrServer.FreeOnTerminate:=true;
GetAddrServer.Priority:=tpIdle;
GetAddrServer.Resume;
bStartUDPServer.Enabled:=false;
end;

procedure TForm1.bStopUDPServerClick(Sender: TObject);
begin
try
 GetAddrServer.Terminate;
except
end;
CloseSocket(SockServer);
WSACleanup;
bStartUDPServer.Enabled:=true;
end;

end.


Может быть есть ошибки - я думаю сам разберешся.

Удачи.

Это сообщение отредактировал(а) Girder - 2.7.2004, 15:46


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
RA
Дата 3.7.2004, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 10
Всего: 115



Лови исходник многопоточного сканера портов.



Это сообщение отредактировал(а) RAdmin - 23.7.2005, 19:49

Присоединённый файл ( Кол-во скачиваний: 160 )
Присоединённый файл  prtscn.rar 4,71 Kb
PM   Вверх
Girder
Дата 4.7.2004, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 4
Всего: 155



Забыл расписать(а то мож чё непонятно).
Кнопки:
bSendTo - Посылка широковещательного UDP пакета
bStartUDPServer,bStopUDPServer - соответственно запуск и старт UDP эхо сервера.

Компилируеш и запускаеш на двух компьютерах.
На одном запускаеш сервер, на другом посылаеш широковешательный UDP пакет.

Цитата
Но этот процесс растягивается на 10 минут
Можеш время засечь, если успееш конечно biggrin.gif

Удачи.



--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Calypso
Дата 5.7.2004, 04:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 30.6.2004

Репутация: нет
Всего: нет



rolleyes.gif Спосибо мужики!!!!!! Щас буду испытывать, но если чо -- тема не закрыта
PM MAIL   Вверх
Calypso
Дата 5.7.2004, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 30.6.2004

Репутация: нет
Всего: нет



Заценил исходники и от Girder и от
RAdmin. Благодарю, именно это я и ищу уже недели две-три
Цитата
кто ищет тот всегда найдет

Задачи, которые решают эти проги, я бы сказал, прямо перпендикулярные. УGirder на один порт сканируется вся сеть, а у RAdmin на один ИП сканируются все порты. Толико я не понял почему я отправляю пакет на порт 1212 а "приходит" он на сервер в виде совершенно иного, причем при каждом обмене номер порта на сервере увеличивается. Впрочем полезность от этого не уменьшается....

Это сообщение отредактировал(а) Calypso - 5.7.2004, 07:07
PM MAIL   Вверх
Girder
Дата 5.7.2004, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 4
Всего: 155



Вот здесь очень хорошо все расписанно(мне к этому добавить не чего):
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1021

Но если лень читать, то вот выдрал тебе ответ(если я твой вопрос правильно понял rolleyes.gif ):
Цитата
Функцию SendTo можно использовать с сокетами, не привязанными к адресу. В этом случае внутри библиотеки сокетов будет неявно вызвана функция Bind для привязки сокета к адресу InAddr_Any и нулевому порту (т.е. адрес и порт будут выбраны системой).


А вообще почитай, статья свежая и доходчивая.

Удачи.


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Calypso
Дата 5.7.2004, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 30.6.2004

Репутация: нет
Всего: нет



Girder
Цитата
здесь лень выдрал тебе
tounge.gif
Тхенкс Ю rolleyes.gif

Это сообщение отредактировал(а) Calypso - 6.7.2004, 04:38
PM MAIL   Вверх
Петрович
Дата 12.7.2004, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 1
Всего: 55



Сразу извиняюсь за OFFTOP.
Тут заглянул в эту тему, посмотрел приведенный Girder пример. Пу сути правильный, но, по реализации есть серьезное замечание:
Код
procedure TAddrServer.Execute;
begin
while not(Terminated) do Synchronize(GetAdd);
end;

Такая реализация потока абсолютно бессмысленна!
Метод GetAdd в этом случае будет исполняться в контексте основного потока приложения. Т.е. результат будет таким-же как и вызов данного метода непосредственно из обработчика какой-нибудь кнопки.
Убедиться в этом очень просто, достаточно запустить приведенный пример, и нажать кнопку bStartUDPServer. После этого, программа перестанет реагировать на Ваши нажатия, перемещения формы и пр. Реагировать она будет лишь на получение пакета. Это следствие того, что основной поток, вместо того что-бы обрабатывать поток сообщений от Windows, будет приостановлен в ожидании получения пакета (RecvFrom в GetAdd).
Дело в том, что метод Synchronize специально сделан для того, что-бы приостановить текущий поток и запустить переданный ему метод в контексте основного потока. Это нужно для обеспечения нормальной работы обращений к VCL-компонентам.
Я бы не стал сюда писать, но дело в том, что подобный стиль написания "многопоточных" приложений я уже встречал, причем в статье то-ли на "Мастерах Дельфи", то-ли в "Королевстве Делфи". К счастью, сейчас найти эту статью мнее не удалось, надеюсь ее сняли с сайта.
В той статье, автор пропагандировал именно такой способ написания многопоточных приложений! Он искренне считал что таким образом, выполняя основное действие через Syncronize, он получает именно многопоточное приложение.
Так что мне кажется, что Girder стал жертвой этой вредоносной статьи.



--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Girder
Дата 12.7.2004, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 4
Всего: 155



По моему ты ошибся, я подправил это в тот же день как записал. Я даже оставил в годе: "// обшибся: было Synchronize(GetAdd);". И дату посмотри когда я внес и отредактировал: внес:"Дата 2.7.2004, 13:51" отредактировал: "Это сообщение отредактировал Girder - 2.7.2004, 15:46" А эти статьи я не читал. Просто паралельно был загружен код где требуется синхронизация. Просто лень весь код набивать. Набросал на пустую форму заготовки из других и отредактировал, а это просмотрел rolleyes.gif . Когда просматривал повторно, сразу отредактировал это место.

Мой кладезь знаний: MSDN и Help Delphi

Удачи.

Это сообщение отредактировал(а) Girder - 12.7.2004, 09:38


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Петрович
Дата 13.7.2004, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 1
Всего: 55



Цитата
По моему ты ошибся, я подправил это в тот же день как записал....

Приношу свои извинения. adv/76.gif
У меня страница была сохранена на локальном диске в первоначальной редакции. Поэтому предыдущий пост относился именно к ней.

Что касается текущей редакции (от 2.7.2004, 15:46) то она к сожалению тоже не без греха. smile.gif

Дело в том, что обращение к методам и свойствам VCL в контексте не основного потока небезопасно. Т.е., как раз вот такие операторы:
Код
Form1.Memo1.Lines.Add(....)

допустимо использовать лишь методах запускаемых через Synchronize.

Самое неприятное, что это вызывает ошибки довольно редко. Но проявляться они могут настолько странным образом, что могут кого угодно запутать.

В качестве примера, такое в принципе приемлемо - в данном случае, вряд-ли кто будет во время вывода в Memo что-то туда "вколачивать". Но, для "боевой" программы это недопустимо.

Это сообщение отредактировал(а) Петрович - 13.7.2004, 08:39


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Girder
Дата 13.7.2004, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 4
Всего: 155



Согласен. Только вывод в Memo cделан для наглядности работы проги(а не для того чтобы тупа передерать rolleyes.gif ), вопрос то не в этом был.
Цитата
... она к сожалению тоже не без греха
А вот главное ты не сказал. А главное на мой взгляд вот в чем: За такие широковешательные пакеты, некоторые админы могут дать по шапке biggrin.gif .

Ладно, думаю мы друг друга поняли.

Удачи.

Это сообщение отредактировал(а) Girder - 13.7.2004, 09:15


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Calypso
Дата 13.7.2004, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 30.6.2004

Репутация: нет
Всего: нет



Мой админ мне по шапке не дастadv/66.gif: Я с ним пиво пил adv/76.gif
Благодарствую!
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1288 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.