Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Многопоточность / 25 сообщений из 28, страница 1 из 2
17.06.2016, 16:57
    #39258023
mishanya3624
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
Приветствую!
Такой вопрос:
хочу пропинговать ту, или иную подсеть и найти все свободные ипы.
Вопрос во времени, если все пускать одним циклом в одном потоке, то все будет долго.
Если я буду каждый пинг пускать в отдельном потоке, 253 потока, это же не знаю как назвать:)
Или как в таких случаях делают?
...
Рейтинг: 0 / 0
17.06.2016, 17:04
    #39258028
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
Потоки не нужны, просто создается 253 сокета, и пингуют они асинхронно.
...
Рейтинг: 0 / 0
17.06.2016, 17:07
    #39258030
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
Впрочем, 253 это возможно многовато, я в такой ситуации, уже не помню почему, открывал 30, и по мере освобождения подсовывал им следующие адреса из очереди.
...
Рейтинг: 0 / 0
17.06.2016, 17:16
    #39258035
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
mishanya3624хочу пропинговать ту, или иную подсеть и найти все свободные ипы.отсутствие ответа на ICMP запрос - не означает, что адрес свободен
...
Рейтинг: 0 / 0
17.06.2016, 17:24
    #39258046
mishanya3624
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
Изопропил,

да, все верно, я чтобы понять принцип, как в таких ситуациях быть.
...
Рейтинг: 0 / 0
17.06.2016, 17:54
    #39258075
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
...
Рейтинг: 0 / 0
17.06.2016, 18:01
    #39258080
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
вообще в 1 сети может быть больше 253 адресов :)
...
Рейтинг: 0 / 0
17.06.2016, 18:13
    #39258085
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
mishanya3624да, все верно, я чтобы понять принцип, как в таких ситуациях быть.Использовать ARP протокол.
...
Рейтинг: 0 / 0
17.06.2016, 18:13
    #39258087
mishanya3624
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
Алексей К,

не, тут весь цЫнус в изучении c#:)
...
Рейтинг: 0 / 0
17.06.2016, 18:20
    #39258092
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
mishanya3624Алексей К,

не, тут весь цЫнус в изучении c#:)Тогда в дополнение к C# придётся изучить Using the Address Resolution Protocol и .Net PInvoke

Тут есть примеры.
...
Рейтинг: 0 / 0
17.06.2016, 21:43
    #39258143
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
mishanya3624цЫнус
Цимес
...
Рейтинг: 0 / 0
17.06.2016, 22:42
    #39258150
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
Изопропилmishanya3624цЫнус
Цимесцимес + анус = цынус
...
Рейтинг: 0 / 0
18.06.2016, 08:59
    #39258190
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
Алексей Кmishanya3624да, все верно, я чтобы понять принцип, как в таких ситуациях быть.Использовать ARP протокол.
Нет в Мире совершенства

Для работы через ARP используется вызов
[DllImport("iphlpapi.dll", ExactSpelling = true)]
Пример
http://stackoverflow.com/questions/1148778/how-do-i-access-arp-protocol-information-through-net

Прикол в том, что это работает ТОЛЬКО внутри одной сети.
У меня сетей, как у дурака фантиков.

Наверное я что-то не понимаю или не знаю, но MAC- адрес, а следовательно подтверждение соединения по сети с удаленным компом можно получит выполнив команду NBTSTAT. Я не понимаю, как она работает.
Был бы признателен, если бы кто объяснил.


Для определения работы компа в сети можно попробовать открыть порт 137/udp, который используется NBTSTAT.
Обычно он открыт.
...
Рейтинг: 0 / 0
18.06.2016, 09:40
    #39258198
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
Cat2Прикол в том, что это работает ТОЛЬКО внутри одной сети.ТС вроде как именно этого и хотел.
Cat2Для определения работы компа в сети можно попробовать открыть порт 137/udp, который используется NBTSTAT.
Обычно он открыт.Открыть можно любой порт и попытаться к нему подсоединиться. Но гарантий открытости порта никаких.
...
Рейтинг: 0 / 0
18.06.2016, 09:51
    #39258200
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
Еще раз огромное спасибо мемберу Изоприл, только благодаря его ценным указаниям мне удалось сделать этот пример по ограничению одновременно выполняемых потоков. См.
Непонятная ошибка по границам массива

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplicationTasks
{
    class Program
    {
       
        static void Main(string[] args)
        {
            int cnt = 1024; // количество фигни, которую надо обработать
            int k = 0;
            int maxk = 50; // максимально допустимое количество потоков, которую обрабатывае фигня. Подбирапется экспериментальным путем
            string[] a = new string[cnt];
            List<Task> tasks = new List<Task>();
            
            for (int i = 0; i < cnt; i++)
            {
                k++;
                int j = i;
                a[i] = string.Format("{0} {1}", j,k);
               
                tasks.Add(Task.Factory.StartNew(() =>
                {
                    Fignia(a[j]);
                }));
                //запустили maxk потоков - ждем-с пока кто-то не отработает. 
                if (k == maxk)
                {
                    k--;
                    Task.WaitAny(tasks.ToArray());
                }
            }
            Task.WaitAll(tasks.ToArray());
            Console.ReadLine();
        }
        static void Fignia(string ik)
        {
            //Имитация процессов с разным временем выполнения
            Random rnd = new Random();
            Thread.Sleep(rnd.Next(50, 5000));
            Console.WriteLine(ik);
        }
    }
}


Наверное это не лучшее решение, но хоть так
...
Рейтинг: 0 / 0
18.06.2016, 10:19
    #39258203
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
Алексей КCat2Прикол в том, что это работает ТОЛЬКО внутри одной сети.ТС вроде как именно этого и хотел.
Cat2Для определения работы компа в сети можно попробовать открыть порт 137/udp, который используется NBTSTAT.
Обычно он открыт.Открыть можно любой порт и попытаться к нему подсоединиться. Но гарантий открытости порта никаких.
Гарантии открытости порта дает руководство, специальным приказом

В минуты отчаяния, когда ничего не получается, я мечтаю о том, что можно бы было работать в маленькой компании, где всего 10 000 компов и все они включены в одну сеть
...
Рейтинг: 0 / 0
19.06.2016, 20:28
    #39258534
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
mishanya3624Или как в таких случаях делают?
В таких случаях через жопу не делают вообще. Либо подними DHCP сервер и пусть он раздает IP, либо напиши регламент кому какой IP можно выдать и кто должен вести учет, а в случае задвоения наказывай рублем того кто выдал два одинаковых IP.
...
Рейтинг: 0 / 0
19.06.2016, 20:55
    #39258536
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
Dima T,

регламент всё равно нужно писать для DHCP сервера
...
Рейтинг: 0 / 0
20.06.2016, 10:40
    #39258694
mishanya3624
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
Да нет комрады, внутри сети все отлично настроено и работает.
Еще раз, разбираюсь с C# в свободное от работы время и на разных примерах,в основном, которые сам для себя придумываю и изучаю потихоньку.
...
Рейтинг: 0 / 0
21.06.2016, 12:54
    #39259562
mishanya3624
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
Несколько вопросов:
1. Как дождаться окончания всех асинхронных процессов, чтобы не создавать второй поток и делать ему Sleep?
2. Как сделать сортировку по возрастанию, сохранить все адреса в List и из него уже сделать выборку по возрастанию, что-то не получается...

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
class Program
    {
        static DateTime start = DateTime.Now;       
        static string ss = "192.168.";
        static void Main(string[] args)
        {    
       
            Console.Write("Enter number:");
            string num = Console.ReadLine();
            ss = ss + num + ".";
            Console.WriteLine(start);

            Pinger(new int[40], 0);
            Pinger(new int[80], 40);
            Pinger(new int[120], 80);
            Pinger(new int[160], 120);
            Pinger(new int[200], 160);
            Pinger(new int[240], 200);
            Pinger(new int[253], 240);

            Thread th = new Thread(Time);
            th.Start();
          
            Console.ReadLine();
        
        } 
        public static void Time()
        {        
            
            Thread.Sleep(20000);
            DateTime end = DateTime.Now;
            Console.Write(end - start);            
            
        }
 
        static async void Pinger(int[] Arr , int i)
        {
            using (Ping p = new Ping())
            {
               
                for (; i < Arr.Length; i++)
                {
                    PingReply pr = await p.SendPingAsync(ss + i, 100);
                    List<string> s1 = new List<string>();
                    s1.Add(ss + i);
                    
                    var sort = from u in s1 orderby i where pr.Status == IPStatus.Success select u ;
                    foreach(string u in sort)
                    Console.WriteLine(u);               
                        
                    
           
                }
            
            }

        }     
   
    }


Спасибо.
...
Рейтинг: 0 / 0
21.06.2016, 13:04
    #39259569
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
mishanya3624Еще раз, разбираюсь с C# в свободное от работы время и на разных примерах,в основном, которые сам для себя придумываю и изучаю потихоньку.
Почитай лучше книжку какую-нибудь, где примеры уже придуманы и тщательно разобраны. Например Рихтера
...
Рейтинг: 0 / 0
26.06.2016, 20:16
    #39262609
Dude42
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
mishanya36241. Как дождаться окончания всех асинхронных процессов, чтобы не создавать второй поток и делать ему Sleep?
Что-то типа этого

https://msdn.microsoft.com/en-us/library/dd270695(v=vs.110).aspx

или этого

https://msdn.microsoft.com/en-us/library/system.threading.tasks.task.whenall(v=vs.110).aspx

И ещё

http://stackoverflow.com/questions/6123406/waitall-vs-whenall

Хотя TaskEx, по-поему, это что-то типа устаревшего расширения, выходившего, пока новая версия .NET не вышла (поправьте, если я неправ) - теперь всё через один класс Task делается.

А вообще, вот хорошая серия статей из книги Альбахари

http://www.albahari.com/threading/
...
Рейтинг: 0 / 0
27.06.2016, 09:35
    #39262711
Dude42
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
mishanya3624Изопропил,

да, все верно, я чтобы понять принцип, как в таких ситуациях быть.
А что, какие-то проблемы возникли? Ничего не пингуется?

Вас пугает само число потоков? В дотнете последних версий их можно десятки тысяч создавать.

Вы хотите ограничить число потоков, одновременно пингующих? - Попробуйте Semaphore .
...
Рейтинг: 0 / 0
27.06.2016, 10:03
    #39262727
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
Dude42В дотнете последних версий их можно десятки тысяч создавать.
дожили.
...
Рейтинг: 0 / 0
27.06.2016, 19:15
    #39263142
Dude42
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
ИзопропилDude42В дотнете последних версий их можно десятки тысяч создавать.
дожили.
Я имел ввиду что-то типа этого http://stackoverflow.com/a/145323/5015385
А то непонятно, почему человек стесняется создавать потоки. Вроде, пока с какой-то проблемой, связанной с этим, не столкнулся, но уже заранее стесняется.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Многопоточность / 25 сообщений из 28, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]