Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Delphi: Сетевое программирование > Сканер портов


Автор: Clane 07.11.03, 16:28
Написал простой сканер портов с использованием сокетов. У меня возник вопрос : как реализовать многопоточность ? Заранее спасибо за ответ.

Автор: rcz 07.11.03, 16:37
IMHO лучше использовать не несколько потоков, а несколько неблокирующих сокетов.

Автор: Clane 07.11.03, 16:44
QUOTE (rcz @ 7.11.03, 16:37)
IMHO лучше использовать не несколько потоков, а несколько неблокирующих сокетов.

А можно по-подробнее ? Что ты имеешь ввиду под небл. сокетом ? Асинхронный и синхронный методы работы ?

Автор: rcz 07.11.03, 18:07
Неблокирующий - асинхронный.
Delphi не знаю, но на С это пиримерно так (WinAPI).

Для простейшего сканирование коннектами.
CODE

WSAEVENT evts[N];
SOCKET s[N];

for(int i=0;i<N;i++){
               s[i]=socket(AF_INET,SOCK_STREAM,0);
               evts[i]=WSACreateEvent();
               WSAEventSelect(s[i],evts[i],FD_CONNECT); //сканирование коннектами.
);

for(int i=0;i<N;i++){
              connect(s[i],addr[i],sizeof(addr[i]);
}

while(!finish){
               DWORD rtval=WSAWaitForMultipleEvents(N,evts,false,TIME_OUT,flase);
               if(rtval==WSA_WAIT_TIMEOUT) /* никаких коннектов нет*/...
               else{
                      int index=rtval-WSA_WAIT_EVENT_0;
                     //изменение адреса этого сокета. И новый запрос.
                     WSAResetEvent(evts[index]);
                     closesocket(s[index]);
                     s[index]=socket(AF_INET,SOCK_STREAM,0);
                     WSAEventSelect(s[index],evts[index],FD_CONNECT);
                     connect(s[i],newaddr,sizeof(newaddr));//берем новый адрес
}

}

for(int i=0;i<N;i++)WSACloseEvent(evts[i]);

Для других способов сканирования можно использовать WSAOVERLAPPED.
З.Ы. код не тестировал.

Автор: Guest___ 08.11.03, 21:37
QUOTE (Clane @ 7.11.03, 19:28)
Написал простой сканер портов с использованием сокетов. У меня возник вопрос : как реализовать многопоточность ? Заранее спасибо за ответ.

Для многоточности там есть Обьект Thread, добовляй его в программу, у него есть свойства
типа создать поток закрыть.
щас не поню точно, найду вобщем линку где я это взял скажу !

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)