информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыПортрет посетителяСетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
[C++] Попробуй 29.11.02 17:39  Число просмотров: 1332
Автор: CZ Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Попробуй функцию select. Почитай о ней в SDK
Используются NONBLOCKING сокеты

SOCKET s;
struct sockaddr_in saddr;
struct timeval tv;
fd_set readfds,writefds,exceptfds;
int retv;
unsigned long opt=1;
unsigned long retioctl;

saddr.sin_family=AF_INET;
saddr.sin_port=htons(33234);
saddr.sin_addr.S_un.S_addr=inet_addr("196.85.202.99");
if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET){
MessageBox(0,"Cant create socket","Error",MB_ICONERROR);
}
if(WSAIoctl(s,FIONBIO,&opt,4,NULL,0,&retioctl,0,0)==SOCKET_ERROR){
MessageBox(0,"Iocstt","Error",0);
};
connect(s,(sockaddr *)&saddr,sizeof(saddr));
FD_ZERO(&readfds);
FD_SET(s,&readfds);
writefds=readfds;
exceptfds=readfds;
tv.tv_sec=1;
tv.tv_usec=0;
int ret;
ret=select(0,&readfds,&writefds,&exceptfds,&tv);
if(ret==0){
MessageBox(0,"TimeOut","Error",0);
}

closesocket(s);
WSACleanup();
<programming>
[C#] или [C++] Присоединиться к порту 29.11.02 14:50  
Автор: Step <Step Alex> Статус: Member
<"чистая" ссылка>
При выполнении метода Connect, если порт открыт все как-бы хорошо и быстро, но в противном случае - очень большая задержка.....особенно если комп вообще выключен или не существует.

Как бы побыстрее узнать.... какой-нить тайм аут уменьшить.... или как вообще определить до открытия порта о том, что по данному IP включен компьютер. Может кто скажет как это реализовывается в C++...
[C#] или [C++] Присоединиться к порту 29.11.02 19:19  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
Вариант 1)Юзать асинхронные сокеты.
Вариант 2)Делать второй поток для коннекта.
В обоих случая обязательно сделать следующее:
int sc=socket(AF_INET,SOCK_STREAM,0);
linger lng;lng.l_onoff=1;lng.l_linger=0;
setsockopt(sc,SOL_SOCKET,SO_LINGER,(char *)&lng,sizeof(lng));
если такого не сделать то при закрытии сокета в процессе установления соединения в NT/2000 происходит memory leak в nonpageable pool(~40000 операций прерванного коннекта и систему придется ребутить)
[C++] Попробуй 29.11.02 17:39  
Автор: CZ Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Попробуй функцию select. Почитай о ней в SDK
Используются NONBLOCKING сокеты

SOCKET s;
struct sockaddr_in saddr;
struct timeval tv;
fd_set readfds,writefds,exceptfds;
int retv;
unsigned long opt=1;
unsigned long retioctl;

saddr.sin_family=AF_INET;
saddr.sin_port=htons(33234);
saddr.sin_addr.S_un.S_addr=inet_addr("196.85.202.99");
if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET){
MessageBox(0,"Cant create socket","Error",MB_ICONERROR);
}
if(WSAIoctl(s,FIONBIO,&opt,4,NULL,0,&retioctl,0,0)==SOCKET_ERROR){
MessageBox(0,"Iocstt","Error",0);
};
connect(s,(sockaddr *)&saddr,sizeof(saddr));
FD_ZERO(&readfds);
FD_SET(s,&readfds);
writefds=readfds;
exceptfds=readfds;
tv.tv_sec=1;
tv.tv_usec=0;
int ret;
ret=select(0,&readfds,&writefds,&exceptfds,&tv);
if(ret==0){
MessageBox(0,"TimeOut","Error",0);
}

closesocket(s);
WSACleanup();
[C++] Забыл. Важное замечание 29.11.02 18:51  
Автор: CZ Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Минус данной реализации.
Неблокирующий сокет нельзя сделать блокирующим после connectа. Это не очень приятно.

Плюс. Не надо создавать отдельных потоков и потом их убивать. К тому же в результате вызова connet сокет остается привязанным к заданному адресу, поэтому если надо повторить connect то возможно прийдется немного подождать, закрыть сокет и опять открыть.
Есть как минимум два пути решения проблеммы: 29.11.02 15:24  
Автор: PS <PS> Статус: Elderman
<"чистая" ссылка>
1. Правильный - я его не знаю ;)
2. Делать connect() в отдельном потоке. А, допустим, основной поток заснет на секунду-другую... Если за это время отдельный поток не выставит ни какого флага, типа все ок, то прибиваешь его и считаешь что коннект не возможен.
На всякий случай, close такому сокету все же сделай (что б не получилась ситуация, что сокет приконектился, а поток флаг поставить не успел, а его тут взяли и прибили).
Всем огромное спасибо 29.11.02 21:57  
Автор: Step <Step Alex> Статус: Member
Отредактировано 29.11.02 21:59  Количество правок: 1
<"чистая" ссылка>
Сделал все таки на ICMP....там выставил тайм ауты... в общем работает быстро.
Хотелось бы, что бы кто то, типа, посмотрел и от..... ну в общем покритиковал, но стремно такую хр..нь показывать. Если у кого есть желание - хотелось бы узнать мнение.

По голове тока не бить :-). Я в бывалые годы не плохо программил( и на машинных кодах тоже). Была у меня к стати самая короткая программа, то ли 3, то ли 2 бита - комп перезагружала, но потом ушел в сторону, всякое администрирование маздая, а вот сейчас снова захотелось, ну чисто для себя.

Простенький порт сканер
Странно, мне это оже пришло в голову, но я сомневался 29.11.02 16:11  
Автор: Step <Step Alex> Статус: Member
Отредактировано 29.11.02 16:15  Количество правок: 1
<"чистая" ссылка>
И всетаки попробую...
Хотя на "прибивание" потока тоже уйдет время и я думаю сравнимое с ожиданием соединения....
Не сравнимое ! 20 секунд - это слишком круто для прибивание потока ;) И именно столько у меня висит connect ожидая ответа из "космоса" 29.11.02 16:18  
Автор: PS <PS> Статус: Elderman
<"чистая" ссылка>
А что если 29.11.02 16:35  
Автор: Step <Step Alex> Статус: Member
<"чистая" ссылка>
Создать сразу множество потоков.... т.е. для каждого коннекта создается свой поток и таки образом, скажем 150 компьютеров проверяются одновременно..... не заглушит ли это систему? И вообще есть какие либо граничения на колличество запущенных потоков?
Не советую ;) 29.11.02 16:54  
Автор: PS <PS> Статус: Elderman
<"чистая" ссылка>
> Создать сразу множество потоков.... т.е. для каждого
> коннекта создается свой поток и таки образом, скажем 150
> компьютеров проверяются одновременно..... не заглушит ли
> это систему? И вообще есть какие либо граничения на
> колличество запущенных потоков?

Ограничение есть, но сколько - не знаю. Дальше можно только абстрактно рассуждать о планировщике, об очереди задач и пр.
Но в любом случае открывать 150 потоков что бы узнать кто жив в сети, а кто нет - не разумно.

Гораздо эффективней сделать два RAW сокета и через первый послать 150ти машинам тобой сформированый пакет на соединение, а на втором смотреть траффик. Те машины с которых пришел ответ - живы, с которых не пришел - увы.

Реализовать это немного сложней чем открывать потоки с connect, то зато более эффективно.

10 секунд у меня 29.11.02 16:30  
Автор: Step <Step Alex> Статус: Member
<"чистая" ссылка>
Но я так понимаю, что покуда поток не закончит хотя-бы один уже исполняющийся опрератор, он прерван не будет...а это как раз connect...
Хм... не совсем так. 29.11.02 16:42  
Автор: PS <PS> Статус: Elderman
<"чистая" ссылка>
> Но я так понимаю, что покуда поток не закончит хотя-бы один
> уже исполняющийся опрератор, он прерван
> не будет...а это как раз connect...

1. Ты можешь бросить такой поток на произвол судьбы. Через N секунд он выйдет из connect, если к этому времени ты решишь, что с сокетом больше не работаешь и выставишь флаг, то поток, после успешного connect сам закроет сокет, при неудачном - просто завершится.
Таким образом ты остановишь выполнение программы только на тот timeout который определишь сам (тот самый Sleep в основном потоке). То что у тебя будет происходить параллельно - тебе будет параллельно ;)

2. На крайняк можешь использовать TerminateThread(). Страшно ? Да. Но прибьет сто процентно. Не зависимо от того, что у тебя там выполняется.
Попоробую...сразу представил себя "Терминаторм" :-) 29.11.02 16:49  
Автор: Step <Step Alex> Статус: Member
<"чистая" ссылка>
А может пинговать другой хост по ICMP? Так тебе не надо самому отслеживать таймауты, если заюзаешь icmp.dll (это под виндой) 29.11.02 17:16  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
А может пинговать другой хост по ICMP? Так тебе не надо самому отслеживать таймауты, если заюзаешь icmp.dll (это под виндой) 29.11.02 19:42  
Автор: Step <Step Alex> Статус: Member
<"чистая" ссылка>
Может и можно , но есть два НО
1. Мне все таки надо знать -открыт порт или нет, хотя пингование могло бы снять вопрос о доступности хоста, и не тратить время на открытие порта если нет ткого компа.
2. Как не пытался прикрутить ICMP - так и не понял, как его поюзать...
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach