Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться срочно!!! TCP-клиент 
:(
    Опции темы
headzero
Дата 6.3.2007, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 14.11.2006

Репутация: нет
Всего: 1



Извините,что повторяюсь. Просто уже долго не могу дождаться ответа. Решил поменять название темы вопроса и описание, потому-что,как вижу  опытных пограммистов слова "Сканер портов" или  "Помогите новичку" не сильно радуют или вызывают иронию. 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!!! Подскажите, медленность изза плохой сети или  невозможно быстрее в принципе? Подскажите может ктото знает более эффктивный код.(Если можно с пояснениями). Как вообще отсканировать все окрытые порты на уделенном компьютере в С#? Спасибо.

 


--------------------
Воображение важнее знания
                                                     (Алберт Эйнштейн)
PM MAIL   Вверх
-Mikle-
Дата 6.3.2007, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 1
Всего: 59



Думаю что скорость увеличить не получится.

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

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


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
headzero
Дата 6.3.2007, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 14.11.2006

Репутация: нет
Всего: 1



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


--------------------
Воображение важнее знания
                                                     (Алберт Эйнштейн)
PM MAIL   Вверх
Gelis
Дата 6.3.2007, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 26.10.2006
Где: Брест

Репутация: нет
Всего: 4



Можно поступить двумя способами
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);

            }

        }
    }
}


PM MAIL   Вверх
headzero
Дата 6.3.2007, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 14.11.2006

Репутация: нет
Всего: 1



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

Это сообщение отредактировал(а) headzero - 6.3.2007, 21:39


--------------------
Воображение важнее знания
                                                     (Алберт Эйнштейн)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

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


 




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


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

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