IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Многопоточный сканер портов, C#
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


Здравствуйте)
Подскажите, пожалуйста, как сканирование портов разбить на потоки? Заранее спасибо)


private void btnPusk_Click(object sender, EventArgs e)
{
string myHost = System.Net.Dns.GetHostName();
string myIP = System.Net.Dns.GetHostByName(myHost).AddressList[0].ToString();
StartPort = Convert.ToInt32(numStart.Value);
EndPort = Convert.ToInt32(numEnd.Value);
Cursor.Current = Cursors.WaitCursor;
for (int CurrPort = StartPort; CurrPort <= EndPort; CurrPort++)
{
TcpClient TcpScan = new TcpClient();
try
{
TcpScan.Connect(myIP, CurrPort);
txtLog.AppendText("Port " + CurrPort + " open\r\n");
}
catch
{
txtLog.AppendText("Port " + CurrPort + " closed\r\n");
}

}
MessageBox.Show("Сканирование завершено");
Cursor.Current = Cursors.Arrow;
}

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 2)
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +



const int threadCount = 4; // Количество потоков
int toProcess = threadCount;
ManualResetEvent resetEvent;

public void DoIt(int start, int finish, string ip) // Функция потока
{
TcpClient TcpScan = new TcpClient();
for (int CurrPort = start; CurrPort <= finish; CurrPort++)
{
string s = "";
try
{
TcpScan.Connect(ip, CurrPort);
s = "Port " + CurrPort + " open\r\n";
}
catch
{
s = "Port " + CurrPort + " closed\r\n";
}

MethodInvoker action = delegate { txtLog.AppendText(s); }; // Синхронизация доп. потока с UI
txtLog.BeginInvoke(action);
}
if (Interlocked.Decrement(ref toProcess) == 0) // Закончился последний из toProcess потоков?
resetEvent.Set(); // Выставить событие, это будет поймано в WaitOne()
}

// Это еще один доп. поток, контролирующий те, которые проверяют порты...
// Если это сделать в обработчике OnClick кнопки, то WaitOne() будет блокировать UI-поток
// до тех пор, пока все остальные потоки не завершатся, и потом просто все результаты
// будут "выплюнуты" в textLog. Это не очень красиво, лучше сделать доп. поток,
// пускай он блокируется вызовом WaitOne(), а UI будет работать без задержек...
void MyControlThread()
{
string myHost = System.Net.Dns.GetHostName();
string myIP = System.Net.Dns.GetHostByName(myHost).AddressList[0].ToString();
int StartPort = Convert.ToInt32(numStart.Text);
int EndPort = Convert.ToInt32(numEnd.Text);

int portCount = (EndPort - StartPort + 1) / threadCount;
resetEvent = new ManualResetEvent(false);
Thread[] th = new Thread[threadCount];

for(int i = 0; i < threadCount; i++) // Запускаем столько потоков, сколько нужно
{
int s = StartPort + i * portCount; // и каждому задаем начальный/конечный порт для сканирования
int f = StartPort + (i + 1) * portCount - 1;
th[i] = new Thread(() => DoIt(s, f, myIP)); //Собственно, создание потока
th[i].Start(); // и его запуск
}
resetEvent.WaitOne(); // теперь ждем, пока всё завершится...
MessageBox.Show("Сканирование завершено");
}

void Button1Click(object sender, EventArgs e)
{
// Ну, а тут - просто запускаем контролирующий поток...
Thread thrd = new Thread(MyControlThread);
thrd.Start();
}
Все просто... smile.gif Но желательно, чтобы общее количество сканируемых портов было кратно числу потоков. Скажем, я проверял порты 200 - 263 (64 штуки), на 4-х потоках и на 8-ми...

Только не ожидай, что вывод результатов будет таким же, как и в твоем примере. Потому что тут порты проверяются совсем в другой последовательности...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 155
Пол: Мужской

Репутация: -  0  +


Why not settling on games that is fun and at the same time your earning. Well itll make suspense because of the game as well but dude just try it and it gave me hope while pandemic is real rn. Mobile Casino: What is it And How Do You Play it?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 0:10
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name