|
реализовать прокси в потоках - Вопросы и ответы, обсуждения - Ваши вопросы по C# только в данном разделе |
11.08.2012, 07:31
|
#16
|
|
|
|
Сержант
|
Регистрация: 01.10.2011
Сообщений: 128
Популярность: 5723
Сказал(а) спасибо: 25
Поблагодарили 174 раз(а) в 105 сообщениях
|
Re: реализовать прокси в потоках
________________
Talk is cheap. Show me the code
— Linus Torvalds
|
|
|
11.08.2012, 12:46
|
#17
|
|
|
|
Рыцарь
|
Регистрация: 09.02.2011
Сообщений: 373
Популярность: 38009
Сказал(а) спасибо: 612
Поблагодарили 448 раз(а) в 175 сообщениях
|
Re: реализовать прокси в потоках
У лока есть недостаток?
А как по другому перебирать прокси в многопотоке?
Для этого делаем переменную summ глобальной и в локе каждому потоку присваиваем её значение и потом увеличиваем на один. Так у каждого потока будет свой индекс потом закрываем лок и всё, потом по этому индексу берем из массива прокси.
Yukikaze, а почему именно чек прокси на работоспособность через гугл?
Почему нельзя получать страницу по адресу прокси? Если ответ есть то рабочее если нет то не рабочее. Все довольно просто! И экономия времени, все прокси чекеры так работают!
________________
Разработка программ на заказ, все вопросы skype - the-boxi, ICQ - 616027961
Последний раз редактировалось the-boxi; 11.08.2012 в 12:49.
|
|
|
Пользователь сказал cпасибо:
|
|
11.08.2012, 13:20
|
#18
|
|
|
|
Сержант
|
Регистрация: 01.10.2011
Сообщений: 128
Популярность: 5723
Сказал(а) спасибо: 25
Поблагодарили 174 раз(а) в 105 сообщениях
|
Re: реализовать прокси в потоках
|
Цитата: |
|
|
|
|
|
|
|
|
|
Почему нельзя получать страницу по адресу прокси?
|
|
|
|
|
|
Так не факт же, только что проверял, по адрес:порт переходит нормально, но прокся не робит. ... или мне просто не свезло
В общем сейчас попробую
fixed
Попробовал, и вправду быстрее, теперь буду знать (:
Добавлено через 1 час 4 минуты
Маленько допилил класс
Код:
static class ProxyQ
{
private static readonly object sync = new object();
public static Queue<string> Proxyes;
public static Queue<string> proxyCache;
static ProxyQ()
{
Proxyes = new Queue<string>();
proxyCache = new Queue<string>();
}
private static bool Check(string proxy)
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://" + proxy);
req.Timeout = 10000;
try
{
req.GetResponse();
}
catch
{
return false;
}
return true;
}
public static string Next()
{
string proxy;
while (Proxyes.Count > 0)
{
lock (sync) proxy = Proxyes.Dequeue();
if (Check(proxy))
{
lock (sync) proxyCache.Enqueue(proxy);
return proxy;
}
}
lock (sync)
{
proxy = proxyCache.Dequeue();
proxyCache.Enqueue(proxy);
}
return proxy;
}
}
Пример реализации
Код:
class Program
{
private static readonly Queue<string> proxyes = new Queue<string>();
private static readonly Object sync = new object();
static void Main()
{
ProxyQ.Proxyes = new Queue<string>(File.ReadAllLines("proxy.txt"));
for (int i = 0; i < 100; i++)
{
ThreadPool.QueueUserWorkItem(Work, i);
}
Console.WriteLine("Press any key...");
Console.ReadKey(true);
}
static void Work(object state)
{
string proxy = ProxyQ.Next();
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://google.ru/search?q="+state);
request.Timeout = 20000;
request.Proxy = new WebProxy(proxy);
Console.WriteLine(state + ". ===" + proxy + "===");
}
catch(WebException e)
{
Console.WriteLine(state + " " + e.Message);
}
}
}
________________
Talk is cheap. Show me the code
— Linus Torvalds
Последний раз редактировалось Yukikaze; 11.08.2012 в 14:38.
Причина: Добавлено сообщение
|
|
|
Пользователь сказал cпасибо:
|
|
11.08.2012, 21:13
|
#19
|
|
|
|
Сержант
|
Регистрация: 06.06.2012
Сообщений: 131
Популярность: 102
Сказал(а) спасибо: 141
Поблагодарили 131 раз(а) в 78 сообщениях
|
Re: реализовать прокси в потоках
Спасибо вам за то что вы мне всё розживали)
При работе ошибка "Очередь пуста"( proxy = proxyCache.Dequeue() .
|
|
|
11.08.2012, 23:11
|
#20
|
|
|
|
Сержант
|
Регистрация: 01.10.2011
Сообщений: 128
Популярность: 5723
Сказал(а) спасибо: 25
Поблагодарили 174 раз(а) в 105 сообщениях
|
Re: реализовать прокси в потоках
Такая ошибка может вылезти если запустить одновременно все потоки, решается правильной работой с пулом потоков или модификацией метода Next
Код:
public static string Next()
{
string proxy;
while (Proxyes.Count > 0)
{
lock (sync) proxy = Proxyes.Dequeue();
if (Check(proxy))
{
lock (sync) proxyCache.Enqueue(proxy);
return proxy;
}
}
//Сюда проверку по типу if(proxyCache.Count == 0) Thread.Sleep(1000); или что-то в этом же духе
lock (sync)
{
proxy = proxyCache.Dequeue();
proxyCache.Enqueue(proxy);
}
return proxy;
}
Но всетаки в первую очень научится работать с потоками
________________
Talk is cheap. Show me the code
— Linus Torvalds
|
|
|
11.08.2012, 23:18
|
#21
|
|
|
|
Сержант
|
Регистрация: 06.06.2012
Сообщений: 131
Популярность: 102
Сказал(а) спасибо: 141
Поблагодарили 131 раз(а) в 78 сообщениях
|
Re: реализовать прокси в потоках
Я об этом уже думал,ставлю 1 поток ошибка та же..(
|
|
|
11.08.2012, 23:31
|
#22
|
|
|
|
Сержант
|
Регистрация: 01.10.2011
Сообщений: 128
Популярность: 5723
Сказал(а) спасибо: 25
Поблагодарили 174 раз(а) в 105 сообщениях
|
Re: реализовать прокси в потоках
Каким образом производится добавление задачи в потоки?
тупым for(i = 0; i < n; ++i) new Thread(DoWork).Start(); ?
процитирую сам себя
|
Цитата: |
|
|
|
|
|
|
|
|
|
можно увидеть проблемный кусок кода?
|
|
|
|
|
|
________________
Talk is cheap. Show me the code
— Linus Torvalds
|
|
|
11.08.2012, 23:38
|
#23
|
|
|
|
Сержант
|
Регистрация: 06.06.2012
Сообщений: 131
Популярность: 102
Сказал(а) спасибо: 141
Поблагодарили 131 раз(а) в 78 сообщениях
|
Re: реализовать прокси в потоках
|
|
|
11.08.2012, 23:47
|
#24
|
|
|
|
Сержант
|
Регистрация: 01.10.2011
Сообщений: 128
Популярность: 5723
Сказал(а) спасибо: 25
Поблагодарили 174 раз(а) в 105 сообщениях
|
Re: реализовать прокси в потоках
Не правильная конструкция
Код:
string[] loginPass = //массив связок логин;пароль
foreach(string logpas in loginPass)
{
ThreadPool.QueueUserWorkItem(Brute, logpas);
}
и собственно сам Brute
Код:
void Brute(object param)
{
//брутим логинпароль
}
А в твоем случае создается N одинаковых потоков без какой либо синхронизации, так еще и куча ресурсов уходит на инициализацию этих самых потоков
Добавлено через 7 минут
Так же можно проюзать такой костыль
Код:
public static string Next()
{
string proxy;
while (Proxyes.Count > 0)
{
lock (sync) proxy = Proxyes.Dequeue();
if (Check(proxy))
{
lock (sync) proxyCache.Enqueue(proxy);
return proxy;
}
}
if(proxyCache.Count > 0)
{
lock (sync)
{
proxy = proxyCache.Dequeue();
proxyCache.Enqueue(proxy);
}
return proxy;
}
return null;
}
________________
Talk is cheap. Show me the code
— Linus Torvalds
Последний раз редактировалось Yukikaze; 11.08.2012 в 23:55.
Причина: Добавлено сообщение
|
|
|
11.08.2012, 23:57
|
#25
|
|
|
|
Сержант
|
Регистрация: 06.06.2012
Сообщений: 131
Популярность: 102
Сказал(а) спасибо: 141
Поблагодарили 131 раз(а) в 78 сообщениях
|
Re: реализовать прокси в потоках
|
Цитата: |
|
|
|
|
|
|
|
|
|
Не правильная конструкция
Код:
string[] loginPass = //массив связок логин;пароль
foreach(string logpas in loginPass)
{
ThreadPool.QueueUserWorkItem(Brute, logpas);
}
и собственно сам Brute
Код:
void Brute(object param)
{
//брутим логинпароль
}
А в твоем случае создается N одинаковых потоков без какой либо синхронизации, так еще и куча ресурсов уходит на инициализацию этих самых потоков
Добавлено через 7 минут
Так же можно проюзать такой костыль
Код:
public static string Next()
{
string proxy;
while (Proxyes.Count > 0)
{
lock (sync) proxy = Proxyes.Dequeue();
if (Check(proxy))
{
lock (sync) proxyCache.Enqueue(proxy);
return proxy;
}
}
if(proxyCache.Count > 0)
{
lock (sync)
{
proxy = proxyCache.Dequeue();
proxyCache.Enqueue(proxy);
}
return proxy;
}
return null;
}
|
|
|
|
|
|
Как я понял тут работает только 1 поток ? а нужна именно многопоточностть.
|
|
|
12.08.2012, 00:04
|
#26
|
|
|
|
Сержант
|
Регистрация: 01.10.2011
Сообщений: 128
Популярность: 5723
Сказал(а) спасибо: 25
Поблагодарили 174 раз(а) в 105 сообщениях
|
Re: реализовать прокси в потоках
________________
Talk is cheap. Show me the code
— Linus Torvalds
|
|
|
12.08.2012, 00:12
|
#27
|
|
|
|
Сержант
|
Регистрация: 06.06.2012
Сообщений: 131
Популярность: 102
Сказал(а) спасибо: 141
Поблагодарили 131 раз(а) в 78 сообщениях
|
Re: реализовать прокси в потоках
|
|
|
12.08.2012, 00:17
|
#28
|
|
|
|
Сержант
|
Регистрация: 01.10.2011
Сообщений: 128
Популярность: 5723
Сказал(а) спасибо: 25
Поблагодарили 174 раз(а) в 105 сообщениях
|
Re: реализовать прокси в потоках
[Na`Vi]DendI, поищи по форуму, здесь уже описывали альтернативные реализации многопоточности
________________
Talk is cheap. Show me the code
— Linus Torvalds
|
|
|
12.08.2012, 00:22
|
#29
|
|
|
|
Сержант
|
Регистрация: 06.06.2012
Сообщений: 131
Популярность: 102
Сказал(а) спасибо: 141
Поблагодарили 131 раз(а) в 78 сообщениях
|
Re: реализовать прокси в потоках
|
Цитата: |
|
|
|
|
|
|
|
|
|
[Na`Vi]DendI, поищи по форуму, здесь уже описывали альтернативные реализации многопоточности
|
|
|
|
|
|
Ну вообщем на етих альтернативных на форуме я и написал)
пилянул так:
Thread[] threads = new Thread[potokov];
for (int i = 0; i < potokov; i++)
{
Thread thr = new Thread(new ThreadStart(Brute));
threads[i] = thr;
Thread.Sleep(55);
threads[i].Start();
}
Последний раз редактировалось [Na`Vi]DendI; 12.08.2012 в 00:30.
|
|
|
12.08.2012, 00:46
|
#30
|
|
|
|
Сержант
|
Регистрация: 01.10.2011
Сообщений: 128
Популярность: 5723
Сказал(а) спасибо: 25
Поблагодарили 174 раз(а) в 105 сообщениях
|
Re: реализовать прокси в потоках
ужасный пример ты нашел, уж лучше так
Код:
List<Thread> Threads = new List<Thread>();
const int max = 8;
int counter = 0;
Queue<string> Logins = new Queue<string>(/* тут как бы заполнили очередь связками логин;пароль */);
while(true)
{
if(Threads.Count > max) continue; //если максимум потоков то пропускаем итерацию
if(Logins.Count == 0) break; //если в очереди не осталось аккаунтов то выходим из цикла
var thread = new Thread(Brute);
thread.IsBackground = true;
thread.Start(Logins.Dequeue());
Threads.Add(thread); //добавляем поток в список
}
метод брута
Код:
void Brute(object param)
{
string pair = (string)param;
//Используем пару лог пасс по назначению
Threads.Remove(Thread.CurrentThread); // удаляем отработавший поток из списка
}
________________
Talk is cheap. Show me the code
— Linus Torvalds
Последний раз редактировалось Yukikaze; 12.08.2012 в 01:05.
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 14:34.
|
|