Вернуться   Форум программистов > Форум Программирование > Форум .NET

.NET

Технология .NET

Ответ
 
Старый 15.11.2006, 20:27   #1
SerSel
Новичок
 
Регистрация: 15.11.2006
Сообщений: 8
SerSel пока не определено
По умолчанию Задача: Получить список всех локальных FTP-серверов, находящихся в онлайне

Доброго времени суток!



Существует задача

Получить список всех локальных FTP-серверов, находящихся в онлайне. Это значит, что есть диапазон IP-адресов 192.168.*.*, каждый из которых необходимо проверить на наличие на нём ftp-сервера (TCP, 21 порт).



Как я решал эту проблему



1. Пробую "влоб" пытаться подключиться к серверам через System.Net.Sockets.TcpClient. Данный вариант не устраивает по двум причинам: необходимо сильно уменьшить время ожидания подключения, т.к. стандартное значение таймаута слишком велико для столь немаленького диапазона хостов. Как менять таймаут подключения (это ни SendTimeout, ни ReceiveTimeout) я не нашёл. Ситуация ещё ухудшается тем, что в случае невозможности подключения вылетает исключение, а его отлов это снова большие потери во времени и уже поэтому не лучший вариант.



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



3. Хорошо, таймаут можно настроить у фунции System.Net.NetworkInformation.Ping.Send, а потом в случае положительного результата можно уже пробовать подключаться по 21 порту. Но: на компьютере с доступным FTP сервером никто не запрещает заблокировать приём или ответ на ICMP echo message - т.е. часть адресов мы потеряем.



Вопрос остаётся - как с минимальными потерями во времени получить полный список активных FTP в локальной сети?
SerSel вне форума  
Старый 15.11.2006, 21:01   #2
bazile
Местный
 
Регистрация: 05.01.2001
Сообщений: 6,924
bazile пока не определено
По умолчанию RE: Сетевые FTP сервера

Я бы пробовал комбинировать п.1 и 2. В любом случае придется перебирать все адреса, по другому никак.
bazile вне форума  
Старый 16.11.2006, 03:04   #3
SerSel
Новичок
 
Регистрация: 15.11.2006
Сообщений: 8
SerSel пока не определено
По умолчанию RE: Сетевые FTP сервера

Ура. Ни на gotdotnet, ни на realcoding ответа так и не дождался.



1. Весь диапазон адресов обрабатывать придётся - это не вызывает сложностей или каких-либо проблем. Кроме одной... Если над каждым неработающим адресом мы будем работать хотя бы даже по паре секунд, то опрос всей сети займёт огромное время.



2. Описанный мной второй вариант всецело основан на первом (всё та же попытка подключиться через сокет), только с асинхронной структурой. Как уже написал, и у него есть куча недостатков.



Поэтому по сути вопрос можно свести к задаче об изменении значения таймаута ожидания ответа на запрос подключения. Подключаться можно абсолютно любым способом.
SerSel вне форума  
Старый 16.11.2006, 17:58   #4
bazile
Местный
 
Регистрация: 05.01.2001
Сообщений: 6,924
bazile пока не определено
По умолчанию RE: Сетевые FTP сервера

Конечно это займет много времени. Шутка ли проверить 65 тысяч <STRIKE>машин</STRIKE> адресов. Пара секунд на одну проверку это даже мало. Не факт что каждый сервер успеет ответить в течение такого короткого интервала.
Механизм исключений замедляет поиск, все верно, но в среде .NET нет классов не использующих исключения. Можно начать использовать функции WinAPI из Windows Sockets 2 там исключений точно нет. Как изменить таймаут соединения в .NET я не знаю.
Так как тебе надо опросить много адресов, то в любом случае придется выполнять парралельную обработку: через асинхронные соединения или многопоточность. Или и то и другое. Конечно в системе существует ограничение на одновременное кол-во открытых сокетов и здесь придется эксперментировать в поиске баланса между скоростью работы и использованием ресурсов машины.
Извини, что не могу дать более полный ответ подкрепленный кодом. Я не специалист в работе с сокетами.
bazile вне форума  
Старый 16.11.2006, 19:24   #5
SerSel
Новичок
 
Регистрация: 15.11.2006
Сообщений: 8
SerSel пока не определено
По умолчанию RE: Сетевые FTP сервера

Насчёт пары секунд - врятли это мало, это очень много. В 90% случаев при нормально работающей хоть даже 10-мбитной локальной сети действительно работающий сервер сразу отвечает менее, чем за 100-200 миллисекунд, на такие ответы и надо рассчитывать в идеале.

Мне, честно говоря, не понятно, почему Ping имеет таймаут, а Connect в сокетах - нет...
SerSel вне форума  
Старый 16.11.2006, 19:49   #6
bazile
Местный
 
Регистрация: 05.01.2001
Сообщений: 6,924
bazile пока не определено
По умолчанию RE: Сетевые FTP сервера

Ответ в течение 100-200 миллисекунд возможен в случае незагруженной сети и низкой нагрузки на сам ftp сервер. В реальной ситуации это не обязательно будет выполняться. Я бы не стал рассчитывать на ответ в течение такого короткого интервала.
bazile вне форума  
Старый 16.11.2006, 20:02   #7
SerSel
Новичок
 
Регистрация: 15.11.2006
Сообщений: 8
SerSel пока не определено
По умолчанию RE: Сетевые FTP сервера

Да, вполне возможно, это так. Но боюсь, что, не зная, как его значение поменять, рассуждать об этом преждевременно...
SerSel вне форума  
Старый 21.11.2006, 03:43   #8
Messir
Местный
 
Регистрация: 05.08.2003
Сообщений: 1,407
Messir пока не определено
По умолчанию RE: Сетевые FTP сервера

Я бы делал так:
1. Запускал бы для каждого адреса отдельный поток, который репортил бы о результате через общее для них событие. Причем обработчик события должен быть помечен как синхронизированный либо использовать локи/семафоры.
2. Таймаутом на TCP-соединениях рулить не получится даже в WinAPI. Ну, не поддерживают блокирующие сокеты таймаута... Поэтому нужно юзать неблокирующий сокет (<STRONG>SetSocketOption()</STRONG>). И самостоятельно ждать нужный таймаут.
Messir вне форума  
Старый 22.11.2006, 04:59   #9
SerSel
Новичок
 
Регистрация: 15.11.2006
Сообщений: 8
SerSel пока не определено
По умолчанию RE: Сетевые FTP сервера

Спасиба, попробую так и делать.
SerSel вне форума  
Ads
Ответ
Опции темы

Похожие темы
Тема Автор
Так как же сделать так, чтобы Remoting выполнялся в уже существующем на сервере объекте? .NET
Общее описание проблемы Существует Solution, состоящий из сервера, клиента и общей dll-библиотеки. Между клиентом и сервером настраивается Remoting-связь для передачи неких данных. Все данные и...
SerSel
FrameWork Silent Setup Command Line Error .NET
Добрый день. Вот эта командная строка - dotnetfx.exe /q:a /c:"install.exe /q" запускает установку DotNetFrameWork в "тихом" режиме. Но пишет ошибки в лог файл. Пишу батник, для установки всех...
slamer
Чем различаются shared и static члены класса .NET
ф
Roman84
Вышли "VS2005 SP1" и "SQL Server 2005 Compact Edition" .NET
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt <SPAN lang=EN-US style="mso-ansi-language: EN-US <STRONG>Вот и дождались.</STRONG></SPAN></P><P class=MsoNormal style="MARGIN: 0cm 0cm 0pt <SPAN...
neo-programer
.NET Быстрый хеш-массив
Подскажите пожалуйста: есть ли в .NET 1.1/2.0 что-то типа Collections.Specialized.ListDictionary, но работающее максимально быстро? От класса требуется только .add, .contains As Boolean, .clear,...
Dion
.NET что будет при отсутствии вызовов EndInvoke после BeginInvoke?
Приветствую! Кто нить знает что будет при отсутствии вызовов EndInvoke после BeginInvoke? Пример:
NickStaves



Текущее время: 06:12. Часовой пояс GMT +4.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.

Рейтинг@Mail.ru