Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/76: Рейтинг темы: голосов - 76, средняя оценка - 4.71
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169

Как сделать алгоритм проверка прокси, через каждый свой поток?

26.10.2020, 16:08. Показов 15079. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, не знаю как даже спросить что бы вы меня поняли.

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

Берется прокси, делается запрос через это прокси, и если прошло успешно то все хорошо.
Ну в принципе мне этого и достаточно, с этим кодом все работает.

Но в чем заключается вопрос? В том что моя программа работает медленно.
Я сделал метод который как раз и делает все это,
он принимает 2 параметра, 1 это список прокси, 2 это токен потока.
Вот он:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void Get(CancellationToken token, string[] ProxyLoad) 
        {
            for (int i = 0; i < ProxyLoad.Length; i++)
            {
                token.ThrowIfCancellationRequested();
 
                HttpRequest request = new HttpRequest();
                request.KeepAlive = true;
                request.UserAgent = Http.OperaUserAgent();
                request.Proxy = ProxyClient.Parse(ProxyType.Socks4, ProxyLoad[i]); //Вот тут! Наша прокси.
 
                GoodProxyText = "";
 
                try { 
                 request.Get(Link).ToString(); ProgressProxyGood(GoodProxy += 1, GoodProxyText = ProxyLoad[i] + "\n");
                } catch (HttpException ex) {
                 ProgressProxyBad(BadProxy += 1); 
                }
            }
        }
Вроде все работает хорошо.

Запускаю я через Task, вот так :
C#
1
2
3
4
5
6
7
private async void button2_Click(object sender, EventArgs e) 
{
            _sourceToken = new CancellationTokenSource();
            CancellationToken token = _sourceToken.Token;
 
           Task task = Task.Factory.StartNew(() => Get(token, ProxyLoad), token);
}
Я написал здесь от руки.
И в чем проблема? В том что я не знаю как сделать так что бы каждый поток проверял свою индивидуальную прокси со списка.
И как это сделать? У меня есть в методе GET Список прокси, который перебирается через цикл и добавляет к
request.Proxy = ProxyClient.Parse(ProxyType.Socks4, ProxyLoad[i]);

А когда я запуская 2 потока, то цикл работает 2 раза и перебирается одна и та же прокси.

Можете мне помочь? Не могу придумать алгоритм, не знаю как это сделать? Что бы каждый поток перебирал свою прокси, может какой нибудь вообще другой алгоритм? Ожидаю от вас помощи! Пишите пожалуйста по теме! Спасибо!

Добавлено через 20 минут
А вот использовать Random я не хотел бы, что бы каждая прокси в своем потоке выбиралась рандомно, наверное я просто не знаю как стабильно это сделать. Потому что когда я пробовал это, я сделал 10 потоков, и у меня очень и очень много раз были хорошие одинаковые прокси.

Типа вот так:
131.255.32.45:44413
131.255.32.45:44413
131.255.32.45:44413
131.255.32.45:44413
131.255.32.45:44413
138.204.140.199:53900
138.204.140.199:53900
138.204.140.199:53900
186.219.3.66:4145
186.219.3.66:4145


И я не знаю почему это так.

Хотя в моих представления это должно быть так:
Первый поток выполняет цикл и этот цикл перебирает прокси рандомно.
Второй поток делает все так - же.

Но получается так что эти два потока все равно перебирают одно и то же прокси.
Не знаю почему так.

Если нужно скину код как я это делал.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.10.2020, 16:08
Ответы с готовыми решениями:

Как скрыть свой ip, через прокси сервер?
Я новичок, подскажите плз как скрыть свой ip, через прокси сервер (только по проще объясните и подробнее). Заранее спасибо!

Async/await и свой поток, как это сделать правильно?
короче классическая очередь задач, 1-99 потоков обрабатывают задачи по очереди есть ли красивый и правильный путь как прикрутить...

Если каждый поток пишет в свой элемент std::vector, является ли это потокобезопасным ?
Добрый день. Вот есть вектор std::vector и каждый поток пишет только в свой элемент. В стандарте ничего не сказано про потокобезопасность...

22
312 / 143 / 77
Регистрация: 23.08.2015
Сообщений: 455
26.10.2020, 17:46
Прочитайте, возможно поможет - https://intuit.ru/studies/cour... 447?page=4
0
Эксперт .NET
 Аватар для Rius
13233 / 7729 / 1680
Регистрация: 25.05.2015
Сообщений: 23,548
Записей в блоге: 14
26.10.2020, 17:53
Очень долгий процесс (оптимизация)
0
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
26.10.2020, 18:31  [ТС]
Tatarin78, да, спасибо. Но я знаю как запускать несколько потоков сразу.

Я вот там еще перелистал на другую лекцию, и по моему нашел что мне нужно если я не ошибаюсь.
Например у меня 12 прокси и 3 потока. 12 / 3 = 4, значит каждый поток будет у меня обрабатывать 4 прокси.

Я что то думал об этом, но вот тут проблема. Если например у меня вот такое число прокси: 13 прокси.
То если мы 13(прокси)/3(потока) = 4,33333333333. Можно конечно сделать целое число, то получается просто 4.
То одна прокси будет не обработана.

Еще если прокси 12 а потоков 12, то каждый поток будет по 1 прокси обрабатывать.
Но если! Если у меня 12 прокси а потоков 20. То 12 / 20? То получается : 0,6. Получается 0 прокси будет обрабатываться.

Можно конечно сделать проверку, если потоков больше прокси то сделать количество потоков равным количество прокси.

Спасибо конечно, буду пробовать.
0
Эксперт .NET
 Аватар для Rius
13233 / 7729 / 1680
Регистрация: 25.05.2015
Сообщений: 23,548
Записей в блоге: 14
26.10.2020, 18:43
Цитата Сообщение от QmlwZ Посмотреть сообщение
но вот тут проблема
Это не проблема.
Используйте Parallel, как я показал выше.
Или выбирайте адреса из стека или очереди. В каждом потоке. Когда стек исчерпается, поток завершается.
0
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
26.10.2020, 22:08  [ТС]
Rius, спасибо. Но я пока что не могу сделать то что я сам написал.

Добавлено через 1 час 3 минуты
Не понимаю еще вот что.
C#
1
2
3
4
 for (int i = 1; i <= CountTask; i++)
            {
                Task task = Task.Factory.StartNew(() => Get(token, ProxyLoad, i, CountTask));
            }
В CountTask`e число 1. Значит цикл должен выполнятся 1 раз. Но в i где Task у параметров, у меня присваивается 2.
В чем дело? Во время отладки все хорошо.

Добавлено через 1 час 17 минут
Как же я уже устал от этого. Опять какие то проблемы и проблемы. Ведь все так хорошо сделал.

Почему при создание 69 потоков у меня дубликатов хороших прокси ой как много...
На выходи получаю те самые 14 прокси из 966. Наверное потому что я 966 / 69 = 14. Но каждое id умножается потом на эти 14, если id = 1, то проверяет 14 прокси из 966, а потом id 2, уже 2 * 14 = 28, и уже 28 проверяются, но проверяются они специальным образом, у меня цикл обрабатывает 14 раз, это 28 - i(14раз). Должно проверять. Ай, ладно, лучше покажу код:

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
private void button2_Click(object sender, EventArgs e) //Создание потоков которые выполняют запросы через прокси.
        {
            int iDProccesTask = 0;
 
            _sourceToken = new CancellationTokenSource();
            CancellationToken token = _sourceToken.Token;
 
            int CountTask = Convert.ToInt32(textBox1.Text);
 
            for (int i = 1; i < CountTask; i++)
            {
                iDProccesTask += 1;
 
                Task task = Task.Factory.StartNew(() => Get(token, ProxyLoad, iDProccesTask, CountTask));
            }
        }
 
public void Get(CancellationToken token, string[] ProxyLoad, int IdTask, int AllStreams) // Делаем запрос
        {
            int Proxy = ProxyLoad.Length / AllStreams; // 966 / 69 = 14.
            int ProxyChecked = Proxy * IdTask; //14 * 1 = 14, 14 * 2 = 28 ... И так до * 69
 
            for (int i = 1; i <= Proxy; i++) //14
            {
                token.ThrowIfCancellationRequested();
                 
                HttpRequest request = new HttpRequest();
                request.KeepAlive = true;
                request.UserAgent = Http.OperaUserAgent();
                request.Proxy = ProxyClient.Parse(ProxyType.Socks4, ProxyLoad[ProxyChecked - i]); //14 раз уменьшая на 1 каждый 14 раз, с 28 все так же.
 
                GoodProxyText = "";
 
                try { 
                 request.Get(Link).ToString(); ProgressProxyGood(GoodProxy += 1, GoodProxyText = ProxyLoad[i] + "\n"); // Если верная, прокси good.
                } catch (HttpException ex) {
                 ProgressProxyBad(BadProxy += 1);  //Если не верная, прокси bad.
                }
            }
        }
Тут метод get, передаются все нужные параметры. Нужно id, общее число потоков.
Потом я делю все прокси на число потоков, после этого умножаю каждое id потока на деленное число.

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

Подскажите что не так то??
0
Эксперт .NET
 Аватар для Rius
13233 / 7729 / 1680
Регистрация: 25.05.2015
Сообщений: 23,548
Записей в блоге: 14
27.10.2020, 15:44
Цитата Сообщение от QmlwZ Посмотреть сообщение
Как же я уже устал от этого. Опять какие то проблемы и проблемы.
Либо исследования своих алгоритмов с постепенным приходом к пониманию. Тогда усталость не важна.
Либо берёте и делаете, как я выше показал. И всё работает.
А свой путь прокладывать - это гарантированно проблемы.

Добавлено через 7 минут
В коде видна одна фича, но она с c# 5 не должна являться проблемой : Замыкания на переменных цикла
0
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
27.10.2020, 16:04  [ТС]
Rius, да я знаю, просто уже как 7 дней вожусь с её, и все это из за потоков. Только начал изучать потоки, и фиг не понимаю как с ними работать.

Цитата Сообщение от Rius Посмотреть сообщение
Либо берёте и делаете, как я выше показал. И всё работает.
Если вы про это:
Цитата Сообщение от Rius Посмотреть сообщение
Очень долгий процесс (оптимизация)
То я не понял о чем там говорится.
0
Эксперт .NET
 Аватар для Rius
13233 / 7729 / 1680
Регистрация: 25.05.2015
Сообщений: 23,548
Записей в блоге: 14
27.10.2020, 16:05
Цитата Сообщение от QmlwZ Посмотреть сообщение
То я не понял о чем там говорится.
О простом способе распараллелить обработку элементов списка. Стандартными средствами .Net, для этого предназначенными.
0
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
27.10.2020, 16:35  [ТС]
Rius, хорошо.

Я как смотрю там, то вот просто не могу понять код, а именно в чем его задача.
И как мне это поможет? Просто мне нужно что бы каждый поток выполнял свою прокси, а распараллелить обработку элементов списка как мне поможет?
0
Эксперт .NET
 Аватар для Rius
13233 / 7729 / 1680
Регистрация: 25.05.2015
Сообщений: 23,548
Записей в блоге: 14
27.10.2020, 16:37
Цитата Сообщение от QmlwZ Посмотреть сообщение
как мне поможет
Это как бы одно и то же.
0
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
27.10.2020, 16:37  [ТС]
Rius, понятно.
0
Эксперт .NET
 Аватар для Rius
13233 / 7729 / 1680
Регистрация: 25.05.2015
Сообщений: 23,548
Записей в блоге: 14
27.10.2020, 16:38
Цитата Сообщение от QmlwZ Посмотреть сообщение
а именно в чем его задача.
Есть список прокси адресов, которые надо опросить. Для сокращения времени - одновременно несколько.
0
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
27.10.2020, 23:48  [ТС]
Rius, вообщем то, не знаю. Я понял почти принцип кода.
Но я что то не пойму.
Цитата Сообщение от Rius Посмотреть сообщение
Это как бы одно и то же.
Ну вот, если одно и тоже, то как мне это поможет? Если я и так пытаюсь это сделать с помощи потоков. Я думаю ведь Task работают друг от друга не мешая себе, выполняя одну и ту же задачу параллейно только с другими параметрами(в моем случаи).

Вообщем то, проблему не решил. Алгоритм работает хорошо, так как я сделал подобную программу на консольном приложении. Попробовал при каждом старте потока ждать его завершение, с помощи task.Wait(), и все работает.
А вот когда запускаю всех в месте то уже просто работает 1 поток из 2 и перебирает элементы с массива.

Вот код:
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
static void Main(string[] args)
        {
            string[] ArrayLoadProxy = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17" };
            int IdTask = 0;
 
            int countTask = 2;
 
            for (int i = 1; i <= countTask; i++)
            {
                IdTask += 1;
 
                Task task = new Task(() => Get(ArrayLoadProxy, IdTask, countTask));
                task.Start();
                //task.Wait(); если добавлю то будет все хорошо
            }
 
            Console.ReadKey();
        }
 
        public static void Get(string[] ProxyLoad, int IdTask, int AllStreams)
        {
            int Proxy = ProxyLoad.Length / AllStreams; //18 элементов и 2 потока. Делим 18 на 2 = 9.
            int ProxyChecked = Proxy * IdTask; // 9 * на id потока. Вот последовательность : 9 * 1 = 9 (1 поток), 9 * 2 = 18 (второй поток) 
 
            for (int i = 1; i <= Proxy; i++) //Проходим через цикл 9 раз, потому что каждый поток должен выполнять цикл 9 раз что бы не проходится по всему массиву второму потоку.
            {
                string Result = ProxyLoad[ProxyChecked - i]; // Первый поток выполняет так: 9 - i(1, 2, 3, 4, 5, 6, 7, 8, 9), значит 1 поток затрагивает от 1 до 9 элементов.
                                                             // Второй поток выполняет так: 18 - i(1, 2, 3, 4, 5, 6, 7, 8, 9), значит 2 поток затрагивает от 10 до 18 элементов.
 
                Random rand = new Random();
                int random = rand.Next(1, 3); //Для правдоподобного эффекта что у меня в задаче, сделал рандомный выбор числа, от 1 до
 
                if (random == 1)
                {
                    Console.WriteLine("Id потока: {0}, Цифра ОК: {1}", IdTask, Result); // если 1 то вывод с сообщение OK.
                } else if(random == 2)
                {
                    Console.WriteLine("Id потока: {0}, Цифра Error: {1}", IdTask, Result); // если 2 то вывод сообщение ERROR. Принцип не меняется, можно без этой проверки.
                }
            }
        }
Вот скрины вывод в консоль:

Наверное в той теме что вы прислали есть решение, но все таки я её вообще не понял.
Миниатюры
Как сделать алгоритм проверка прокси, через каждый свой поток?   Как сделать алгоритм проверка прокси, через каждый свой поток?  
0
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
02.11.2020, 19:59  [ТС]
Проблема решена.
Когда я запускал цикл, который создает потоки и передавал переменную в качестве id потока которая увеличивается при каждом выполнение цикла. Так я пытался создает поток со своим же id.
Пробовал узнавать текущее id потока с помощи currentId, но работало это только с Task.

Как решил? Не знаю как это назвать, возможно замыкание цикла называется. Честно говоря я не знаю что это.
Но проблему я решил, просто создал переменную внутри цикла, увеличивал её, передавая методу Get.

Не так:
C#
1
2
3
4
5
6
int d = 0;
 
for(int i =1; i <= 10; i++){
d += 1;
Get(d);
}
А вот так:
C#
1
2
3
4
for(int i =1; i <= 10; i++){
int d = 0 += 1;
Get(d);
}
Не знаю почему так. Но наверное каждый поток когда начинал работать, переменная передавалась к методу Get уже с конечным результатом после обработки цикла.
Но спасибо тем кто пытался помочь.
0
Эксперт .NET
 Аватар для Rius
13233 / 7729 / 1680
Регистрация: 25.05.2015
Сообщений: 23,548
Записей в блоге: 14
02.11.2020, 20:06
Об этом писал выше:
Цитата Сообщение от Rius Посмотреть сообщение
В коде видна одна фича, но она с c# 5 не должна являться проблемой : Замыкания на переменных цикла
Какая у вас версия - неизвестно.
0
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
02.11.2020, 20:57  [ТС]
Rius, да, но как я понял у меня версия C# 4.0. И не понимаю тогда почему у меня такое происходит.

Может у меня ошибочный вывод:
С# 1.0 выпущен с.NET 1.0

С# 1.2 (как ни странно); выпущен с.NET 1.1

С# 2.0 выпущен с.NET 2.0

С# 3.0 выпущен с.NET 3.5

С# 4.0 выпущен с.NET 4

С# 5.0 выпущен с.NET 4.5

С# 6.0 выпущен с.NET 4.6

С# 7.0 выпущен с.NET 4.6.2

С# 7.3 выпущен с.NET 4.7.2

У меня .NET 4.
0
Эксперт .NET
 Аватар для Rius
13233 / 7729 / 1680
Регистрация: 25.05.2015
Сообщений: 23,548
Записей в блоге: 14
02.11.2020, 21:01
Лучший ответ Сообщение было отмечено QmlwZ как решение

Решение

Цитата Сообщение от QmlwZ Посмотреть сообщение
У меня .NET 4.
Именно 4.0? Вот так, без более высоких цифр?

Добавлено через 58 секунд
Ставьте .Net Framework Dev Pack: https://dotnet.microsoft.com/download

Добавлено через 1 минуту
Цитата Сообщение от QmlwZ Посмотреть сообщение
И не понимаю тогда почему у меня такое происходит.
Такое как раз происходило в C# версии 4 и ниже.
1
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
02.11.2020, 21:04  [ТС]
Rius, посмотрел как узнать, а это зайти в реестр.
Вот что там:
Миниатюры
Как сделать алгоритм проверка прокси, через каждый свой поток?  
0
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
02.11.2020, 21:06  [ТС]
Rius, хорошо, большое вам спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.11.2020, 21:06
Помогаю со студенческими работами здесь

Как сделать так, чтобы каждый поток работал с отдельным элементом массива
н-ое количество потоков (в данном случае 3) выполняют операцию с массивом. Как сделать так, чтобы каждый поток работал с отдельным...

Каждый webbrowser через отдельный прокси
Всем привет. У меня на форме есть два Webbrowser'a и вообще есть два прокси адреса. Можно ли сделать так, чтоб каждый webbrowser...

Как сделать форвард ip4 > ip6 через прокси ?
добрый вечер желательно через сокс в dante не нашёл такой возможности есть ещё варианты? squid вроде может, но может ли он...

В окне перемещаются объекты, отталкиваясь от стенок окна. Каждый объект имеет свой поток, перемещающий его. Встретившись, объекты начинают двигаться
В окне перемещаются объекты, отталкиваясь от стенок окна. Каждый объект имеет свой поток, перемещающий его. Встретившись, объекты...

Проверка соединения с Интернетом через прокси
Как проверить есть ли доступ к Интернету, если компьютер подключен через прокси-сервер?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru