Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

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

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

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

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

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


 




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


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

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