﻿<?xml version='1.0' encoding='UTF-8'?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Релиб / Программирование / .NET  / Сетевые FTP сервера / Latest Posts</title><generator>InstantForum.NET v4.1.4</generator><description>Релиб</description><link>http://www.relib.com/forums/</link><webMaster>robot@relib.com</webMaster><lastBuildDate>Sat, 22 Nov 2008 17:34:31 GMT</lastBuildDate><ttl>20</ttl><item><title>RE: Сетевые FTP сервера</title><link>http://www.relib.com/forums/Topic907559-16-1.aspx</link><description>Спасиба, попробую так и делать.</description><pubDate>Wed, 22 Nov 2006 00:59:50 GMT</pubDate><dc:creator>SerSel</dc:creator></item><item><title>RE: Сетевые FTP сервера</title><link>http://www.relib.com/forums/Topic907559-16-1.aspx</link><description>Я бы делал так:&lt;/P&gt;&lt;P&gt;1. Запускал бы для каждого адреса отдельный поток, который репортил бы о результате через общее для них событие. Причем обработчик события должен быть помечен как синхронизированный либо использовать локи/семафоры.&lt;/P&gt;&lt;P&gt;2. Таймаутом на TCP-соединениях рулить не получится даже в WinAPI. Ну, не поддерживают блокирующие сокеты таймаута... Поэтому нужно юзать неблокирующий сокет (&lt;STRONG&gt;SetSocketOption()&lt;/STRONG&gt;). И самостоятельно ждать нужный таймаут.</description><pubDate>Mon, 20 Nov 2006 23:43:13 GMT</pubDate><dc:creator>Messir</dc:creator></item><item><title>RE: Сетевые FTP сервера</title><link>http://www.relib.com/forums/Topic907559-16-1.aspx</link><description>Да, вполне возможно, это так. Но боюсь, что, не зная, как его значение поменять, рассуждать об этом преждевременно...</description><pubDate>Thu, 16 Nov 2006 16:02:22 GMT</pubDate><dc:creator>SerSel</dc:creator></item><item><title>RE: Сетевые FTP сервера</title><link>http://www.relib.com/forums/Topic907559-16-1.aspx</link><description>Ответ в течение 100-200 миллисекунд возможен в случае незагруженной сети и низкой нагрузки на сам ftp сервер. В реальной ситуации это не обязательно будет выполняться. Я бы не стал рассчитывать на ответ в течение такого короткого интервала.</description><pubDate>Thu, 16 Nov 2006 15:49:22 GMT</pubDate><dc:creator>bazile</dc:creator></item><item><title>RE: Сетевые FTP сервера</title><link>http://www.relib.com/forums/Topic907559-16-1.aspx</link><description>Насчёт пары секунд - врятли это мало, это очень много. В 90% случаев при нормально работающей хоть даже 10-мбитной локальной сети действительно работающий сервер сразу отвечает менее, чем за 100-200 миллисекунд, на такие ответы и надо рассчитывать в идеале.&lt;br&gt;Мне, честно говоря, не понятно, почему Ping имеет таймаут, а Connect в сокетах - нет...</description><pubDate>Thu, 16 Nov 2006 15:24:14 GMT</pubDate><dc:creator>SerSel</dc:creator></item><item><title>RE: Сетевые FTP сервера</title><link>http://www.relib.com/forums/Topic907559-16-1.aspx</link><description>Конечно это займет много времени. Шутка ли проверить 65 тысяч &lt;STRIKE&gt;машин&lt;/STRIKE&gt; адресов. Пара секунд на одну проверку это даже мало. Не факт что каждый сервер успеет ответить в течение такого короткого интервала.&lt;P&gt;Механизм исключений замедляет поиск, все верно, но в среде .NET нет классов не использующих исключения. Можно начать использовать функции WinAPI из Windows Sockets 2 там исключений точно нет. Как изменить таймаут соединения в .NET я не знаю.&lt;/P&gt;&lt;P&gt;Так как тебе надо опросить много адресов, то в любом случае придется выполнять парралельную обработку: через асинхронные соединения или многопоточность. Или и то и другое. Конечно в системе существует ограничение на одновременное кол-во открытых сокетов и здесь придется эксперментировать в поиске баланса между скоростью работы и использованием ресурсов машины.&lt;/P&gt;&lt;P&gt;Извини, что не могу дать более полный ответ подкрепленный кодом. Я не специалист в работе с сокетами.</description><pubDate>Thu, 16 Nov 2006 13:58:32 GMT</pubDate><dc:creator>bazile</dc:creator></item><item><title>RE: Сетевые FTP сервера</title><link>http://www.relib.com/forums/Topic907559-16-1.aspx</link><description>Ура. Ни на gotdotnet, ни на realcoding ответа так и не дождался. :)&lt;br&gt;&lt;br&gt;1. Весь диапазон адресов обрабатывать придётся - это не вызывает сложностей или каких-либо проблем. Кроме одной... Если над каждым неработающим адресом мы будем работать хотя бы даже по паре секунд, то опрос всей сети займёт огромное время.&lt;br&gt;&lt;br&gt;2. Описанный мной второй вариант всецело основан на первом (всё та же попытка подключиться через сокет), только с асинхронной структурой. Как уже написал, и у него есть куча недостатков.&lt;br&gt;&lt;br&gt;Поэтому по сути вопрос можно свести к задаче об изменении значения таймаута ожидания ответа на запрос подключения. Подключаться можно абсолютно любым способом.</description><pubDate>Wed, 15 Nov 2006 23:04:11 GMT</pubDate><dc:creator>SerSel</dc:creator></item><item><title>RE: Сетевые FTP сервера</title><link>http://www.relib.com/forums/Topic907559-16-1.aspx</link><description>Я бы пробовал комбинировать п.1 и 2. В любом случае придется перебирать все адреса, по другому никак.</description><pubDate>Wed, 15 Nov 2006 17:01:26 GMT</pubDate><dc:creator>bazile</dc:creator></item><item><title>Сетевые FTP сервера</title><link>http://www.relib.com/forums/Topic907559-16-1.aspx</link><description>Доброго времени суток!&lt;br&gt;&lt;br&gt;[b]Существует задача[/b]&lt;br&gt;Получить список всех локальных FTP-серверов, находящихся в онлайне. Это значит, что есть диапазон IP-адресов 192.168.*.*, каждый из которых необходимо проверить на наличие на нём ftp-сервера (TCP, 21 порт).&lt;br&gt;&lt;br&gt;[b]Как я решал эту проблему[/b]&lt;br&gt;&lt;br&gt;[b]1.[/b] Пробую "влоб" пытаться подключиться к серверам через System.Net.Sockets.TcpClient. Данный вариант не устраивает по двум причинам: необходимо сильно уменьшить время ожидания подключения, т.к. стандартное значение таймаута слишком велико для столь немаленького диапазона хостов. Как менять таймаут подключения (это ни SendTimeout, ни ReceiveTimeout) я не нашёл. Ситуация ещё ухудшается тем, что в случае невозможности подключения вылетает исключение, а его отлов это снова большие потери во времени и уже поэтому не лучший вариант.&lt;br&gt;&lt;br&gt;[b]2.[/b] Да, можно использовать асинхронную операцию BeginConnect, но она не устроивает по тем причинам, что один сокет нельзя одновременно использовать для нескольких подключений (кто бы сомневался), а создание большого числа сокетов тоже нежелательно, в итоге это может кончиться сотнями открытых портов, всяческими переполнениями, т.к. насколько я знаю, на их количество в системе тоже есть ограничение.&lt;br&gt;&lt;br&gt;[b]3.[/b] Хорошо, таймаут можно настроить у фунции System.Net.NetworkInformation.Ping.Send, а потом в случае положительного результата можно уже пробовать подключаться по 21 порту. Но: на компьютере с доступным FTP сервером никто не запрещает заблокировать приём или ответ на ICMP echo message - т.е. часть адресов мы потеряем.&lt;br&gt;&lt;br&gt;Вопрос остаётся - как с минимальными потерями во времени получить полный список активных FTP в локальной сети?</description><pubDate>Wed, 15 Nov 2006 16:27:08 GMT</pubDate><dc:creator>SerSel</dc:creator></item></channel></rss>