![]() |
|
Модераторы: feodorv |
![]()
|
|
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: нет Всего: 1 |
Написал простенькую программку сканер-портов.Ищет в указанном интервале активные порты и выводит имена служб для них.
если в качестве имени хоста задаю rsu.ru , или mail.ru (интервал портов 1-1000), то все работает нормально. А если пытаюсь microsoft.com, то если проверять такие порты,как 21-ftp или 80-http по отдельности, то все работает. Как только начинаю сканировать интервал ,например 80-81, прога виснет. Подскажите почему? Можно ли избежать зависания? |
|||
|
||||
| Johen |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 25.5.2004 Где: Санкт-Петербург Репутация: нет Всего: нет |
Я думаю у тебя проблема с интервалом. Проверь цикл обхода номеров портов.
Скорее всего проблема не в этом, но вполне вероятно... |
|||
|
||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: нет Всего: 1 |
Но ведь для mail.ru все сканируется нормально в указанном промежутке и для vingrad.ru
получается от 1-1000 сканировать. |
|||
|
||||
| knave |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 6.3.2003 Где: Санкт-Питербург ( Россия) Репутация: 1 Всего: 5 |
Возможно закрыт доступ к портам. Ты пытаешся законектится и не можеш, а таймаут возможно не предусмотрел - вот и висиш.
Это сообщение отредактировал(а) knave - 15.4.2005, 13:44 -------------------- С наилучшими пожеланиями !!! |
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: нет Всего: 62 |
Leksey
с помощью чего писал?Если МФС-могу дать готовій сканер портов.Там раскоментишь пару строк,и увидишь чего виснет.Сканирует с 21 по 60000.......2 порта в секунду.Реализована многопоточность. -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: нет Всего: 1 |
Спасибо за советы Coocky и knave.Думал что никто уже не откликнется.
Пробавал yahoo.com тоже самое что с microsoft.com. Coocky спасибо за предложения, но я пишу не с помощью MFC, а под UNIX, и многопоточность для меня- что-то очень далекое . knave не мог бы ты мне подсказать как предусмотреть таймаут. Заранее благодарен. Вот собственно говоря и код:
|
|||
|
||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: нет Всего: 1 |
Люди кто знает что такое таймаут, который имел в виду knave и как его реализовать?
|
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
Проблема была и есть и не только у систов. Помню как то Изатоп тоже на php с этим мучался, прога просто висла.
Сокеты вещь корявая, так что если ты хочешь юзать один сокет для подключения вида: подсоединился->отправил->отсоединился То тогда вместо close юзай shutdown. Проблема в следующем сокет не успевает отконектиться от сервака, в виду того, что тот ему что-то ещё должен послать.... а тут как тут на него взваливается новое подключение. Причем для таких быстрых и не загруженных ресурсов, как vingrad сокет успевает получить все что нужно для разоединения и спокойно уйти в даун, а когда коннектишься к микрам, у них как всегда тормоза и твой сокет начинает колбасить. Короче вывод : для твоей задачи юзай shutdown. Добавлено @ 08:01
Насколько мне известно, это когда ты программно спрашиаешь у сокета свободен ли он для нового подключения или нет, обычно засовывается в while(пока не доступен){} |
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: нет Всего: 317 |
для начала хотелось бы попросить народ про "распанаханные серваки" и "заколбашенные сокеты микра" не гнать.типа ... "сокеты микра" весят на 23 грамма больше чем "незагруженные винградовские". на этих корявых сокетах висит весь интернет.
может у вас есть идеи как можно без них обойтись ? :-) Далее... Leksey. давай разделять и властвовать... а) с точки зрения сайта yahoo сканирование портотв - плохо. кушает память, грузит и т.д., может довести до отказа сервера. поэтому они ставят в сети фаервол (на него можно смотреть как в роли КПП.), и он проглатывает ненужые пакеты ( SYN ). это иногда называют "блокировать". поэтому, когда ты коннектишься, то получив SYN, yahoo не отсылает тебе обратно ACK., и ты сидишь и ждёшь ответа... заметь, что это может даже не реакция на сканирование, а статические правила. ( "если кто стучится на неправильный порт - не отвечаем" ) б) ( без связи с сокетами ) с точки зрения программера , есть 2 вида I/O. блокирующий (1.) и не блокирующий (2.) и их можно тоже перевести ошибочно как "блокированный" и "неблокированный": 1. когда ты функцию запускаешь, она возвращается только после того как завершится: либо удачно, либо с ошибкой, программа во время выполнения этого вызова спит ( blocked ). поэтому и название. 2. когда ты запускаешь функцию, и она сразу возвращается. но тогда ты ждёшь "событий" ( events/interrupts ) и на них реагируешь. такая программа асинхронна, труднее в написании, отлаживании, но еффективнее ( напр. не висит зря в позе Зю. ) соединяем а + б: есть 2 вида сокетов - блокирующий (или синхронный, используется по умолчанию), и неблокирующий , асинхронный. если хочешь узнать как работать со вторым - кури интернет на non-blocking socket. тебе нужно будет создать: 1. неблокирующий сокет ( ну ... или несколько потоков с ними ) 2. обработчик событий. он будет отлавливать события времени, и когда таковых произойдёт сколько ты хочешь, он сообщит "я сдаюсь" ( т.е. тайм-аут) 3. ты вызовёшь "connect()" ( или как он у вас в виндах называется) и будешь отлавливать события. ессно, может нужно не один обработчик. пока. Это сообщение отредактировал(а) bilbobagginz - 21.4.2005, 09:20 -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| Leksey |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 12.12.2004 Репутация: нет Всего: 1 |
En_t_end прикольно получилось у меня 51 сообщение было, пока это не отправил, а у тебя 510:-)
Я не думаю что это связано с быстродействием. Скорее просто закрыт доступ к портам. По поводу shutdown - мне кажется что close более серьезная, она же и закрывает socket, к тому же я подключаюсь каждый раз через разные сокеты, поэтому я не "взваливаю на него свое подключение." Я попробывал с shutdown(s,SD_BOTH) перед close -результат тотже. Тем не менее большое спасибо En_t_end за помощь и еще вопрос не зает ли кто как спросить у сокета о том что он доступен или нет? Добавлено @ 09:30 Спасибо bilbobagginz. Будем искать non-blocking socket. Да по ходу моя домашняя работа по компьютерным сетям набирает обороты... |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
bilbobagginz
На счет микров --- Megaгон 1. Я не говорил бы так, если не проверял бы. 2. А проверял я следующим образом, одной своей простенькой прогой коннектился сначало к винграду а потом к микрам. Причем на действующий и работающий порт. 3. В этих испытаниях я заметил одну престанную вещь.... интервал между посылкой первого идентификационного пакета и конечным у микров составил около 15!!!! секунд, когда как винград откликнулся через 3 секунды. ЗЫ и удаленность тут ни причем, потому что коннектясь на орговские америкосовские ресурсы я получял ответ через 5 секунд.
LOL я даже это в виду не имел При чем тут это)))) ? Проснись парень, скорость от обьема давно уже в большинстве случаев перестала зависеть. |
|||
|
||||
| Arush |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 10.11.2003 Репутация: нет Всего: 1 |
Под рукой сейчас *nix нет - пишу по памяти, если что не так - звиняйте.
Насколько я помню это делалось так: Заводишь себе массив сокетовю Через setsockopt выставляешь сокетам опцию SO_NONBLOCK (сразу после создания). После этого когда ты вызовешь connect и тебе вернется ошибка EINPROGRESS - значит идет процесс соединения. Затем используя select ты получаешь номера сокетов, состояние которых изменилось - т.е. произошло соединение, в соединении отказано, истек таймаут и т.п. Эти сокеты закрываешь, и пытаешься соединятся на следующие порты. И так пока не переберешь весь диапазон. Где выставляется таймаут на соединение я не помню, но его можно эмулировать, заведя свой массив таймаутов и обновляя его после каждого вызова селект. ЗЫ. Читайте доки - они рулез |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |