Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > Помогите разобраться срочно!!!


Автор: headzero 6.3.2007, 16:34
Извините,что повторяюсь. Просто уже долго не могу дождаться ответа. Решил поменять название темы вопроса и описание, потому-что,как вижу  опытных пограммистов слова "Сканер портов" или  "Помогите новичку" не сильно радуют или вызывают иронию. smile
И все же,кому не лень, ответте,пожалуста на вопрос.
Вот имеется код порт сканера:

Код

using System;
using System.Net.Sockets;
using System.Net;

public class SocketConn
{
public static void Main(string [] args)
{

IPAddress address = IPAddress.Parse("127.0.0.1");


for (int i=1; i < 1024; i++)
{
Console.WriteLine("Checking port {0}",i);

try
{ 
IPEndPoint endPoint = new IPEndPoint(address,i);
Socket sSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);

sSocket.Connect(endPoint);

Console.WriteLine("Port {0} is listening",i);

} 
catch(SocketException ignored)
{
if (ignored.ErrorCode != 10061)
Console.WriteLine(ignored.Message);

} 

} 
}
}    


В принципе понимаю как он работает.Пробовал сканировать разные айпишники. Но єта программа работает силно медленно: в лучшем случаи сканирует 1 порт в секунду. А ведь их больше 60000!!! Подскажите, медленность изза плохой сети или  невозможно быстрее в принципе? Подскажите может ктото знает более эффктивный код.(Если можно с пояснениями). Как вообще отсканировать все окрытые порты на уделенном компьютере в С#? Спасибо.

 

Автор: -Mikle- 6.3.2007, 18:04
Думаю что скорость увеличить не получится.

Выход вижу пока что только один:
Сделать класс, который запускает сканирование одного порта в отдельном потоке. А скорость будет достигаться одновременностью выполнения сканирования нескольких портов. Конечно же не прямопропорциональна, но все же. Реализация должна быть такой, что создается несколько потоков и им раздается задание. Как только завершается задание у какого-то потока, он об этом сообщает и ему дается следующее задание.

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

Автор: headzero 6.3.2007, 18:11
Я тоже так думал. Возможно чето получится.Если можно,поделись своими набросками. Спасибо.

Автор: Gelis 6.3.2007, 19:38
Можно поступить двумя способами
1. Криво - пустить подключение в несколько потоков
2. И правильно с помощью ассинхронного метода

headzero, код приведенный вами взят из книги "Сетевое программирование для профессионалов". Там сразу после этого примера рассказывается про асинхронное программирование. Будут какие-то вопросы пишите.
Вот работающий пример, за пару секунд сканирует все порты.
Код

using System;
using System.Net.Sockets;
using System.Net;
using System.Threading;

public class SocketConn
{
    public static ManualResetEvent ConnectionDone = new ManualResetEvent(false);
    private static void Connect_CallBack(IAsyncResult result)
    {
        Socket sSocket = (Socket)result.AsyncState;
        sSocket.EndConnect(result);
        Console.WriteLine("Port {0} is listening", sSocket.RemoteEndPoint.ToString().Split(':')[1]);
        ConnectionDone.Set();
    }
    public static void Main(string[] args)
    {

        IPAddress address = IPAddress.Parse("10.3.0.42");


        for (int i = 1; i < 300; i++)
        {
            //Console.WriteLine("Checking port {0}", i);

            try
            {
                IPEndPoint endPoint = new IPEndPoint(address, i);
                Socket sSocket = new Socket(AddressFamily.InterNetwork,
                SocketType.Stream,
                ProtocolType.Tcp);
                

                sSocket.BeginConnect(endPoint,new AsyncCallback(Connect_CallBack),sSocket);

            }
            catch (SocketException ignored)
            {
                if (ignored.ErrorCode != 10061)
                    Console.WriteLine(ignored.Message);

            }

        }
    }
}


Автор: headzero 6.3.2007, 21:30
Да Gelis мой пример именно из той книги.Сейчас почитаю дальше.Спасибо за пример.Объясни,пожалуста,как он работает.

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