Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > простой сканер сети


Автор: progmax 3.3.2007, 17:07
Постала задача написания простого сканера сети.
Для этой цели использую компонент ClientSocket:

Код

ClientSocket1.Port:=21;
for i:=0 to 255 do 
begin
 ClientSocket1.Host:='1.1.2.'+i;
 ClientSocket1.Active:=true;
end;

 В событии OnConnect формирую список IP-адресов с открытым 21 портом:

Код

ListBox1.Items.Add('1.1.2.'+i);
ClientSocket1.Active:=false;


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

Автор: MetalFan 3.3.2007, 19:57
Цитата(progmax @  3.3.2007,  17:07 Найти цитируемый пост)
Во время запуска программа выдает ошибку

круто! а теперь все угадываем, что за ошибка)
з.ы. перед изменением Host Active := false

Автор: Matematik 3.3.2007, 21:33
progmax, 
Режим работы сокета?

Автор: progmax 4.3.2007, 10:40
Цитата(MetalFan @ 3.3.2007,  19:57)
круто! а теперь все угадываем, что за ошибка)
з.ы. перед изменением Host Active := false

Ошибка:
Project scan.exe raised exception class ESocketError with message 'Asynchronous socket error 10049'

Насколько я понимаю алгоритм следующий:
1. попытка активировать сокет
2. если не удается, то событие OnError
3. если удается - OnConnect

Добавлено @ 10:46 
Цитата(Matematik @ 3.3.2007,  21:33)
progmax, 
Режим работы сокета?

Не совсем понятен вопрос!

Автор: Matematik 4.3.2007, 11:32
По умолчанию этот компонент работает в асинхронном режиме (параметр ClientType) т.ч. при попытке активировать сокет, программа не ждет установки соединения(или ошибки), а продолжает работать дальше. При таком подходе в цикле проверять возможность соединения нельзя!

Цитата(progmax @  4.3.2007,  10:40 Найти цитируемый пост)
Насколько я понимаю алгоритм следующий:
1. попытка активировать сокет
2. если не удается, то событие OnError
3. если удается - OnConnect


В этом ты прав.
Как подавить ошибку http://forum.vingrad.ru/topic-139066.html

Автор: progmax 4.3.2007, 11:56
Исходя из выше сказанного изменил в программе следующее:
 - добавил в событие OnError компонента  ClientSocket:
Код

ErrorCode:=0;
 
- в свойстве компонента ClientType установил ctBlocking.

Теперь если заданный порт открыт на удаленном хосте то программа отрабатывает без ошибки. А вот если порт закрыт - программа выдает ошибку: "Подключение не установлено, т.к. конечный компьютер отверг запрос на соединение".
Наверное прийдеться использовать исключение (try).
А если удаленный ПК отключен или в сети нету такого IP-адреса компонент доволи долгое время пытается открыть сокет. Подскажите, пожалуйста, где можно установить таймаут?

Автор: Dr_midon 2.4.2007, 18:45
При соединении включай таймер(склько хочеш подождать), а при наступлении времени обрывай соединение

Единственная фигня - метод варварский и не дождавшись ответа мона пропустить адресок...

Автор: Volkss85 22.10.2007, 16:59
Приветик пацики КАК создать болкиратор сетки типа ширмы чтоб одни пользовались легко входили в нужную сеть а отдельная группа работала отдельно не видя основную сетку но есть проблема по сетке раскидуется Интернет smile 

Автор: MetalFan 22.10.2007, 21:15
Volkss85, "пацик" =>  smile 
hint: пиши на русском.

Автор: Volkss85 23.10.2007, 13:29
раздупли smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)