Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Блокрованые сокеты 
:(
    Опции темы
Leksey
Дата 3.4.2005, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: нет
Всего: 1



Написал простенькую программку сканер-портов.Ищет в указанном интервале активные порты и выводит имена служб для них.
если в качестве имени хоста задаю rsu.ru , или mail.ru
(интервал портов 1-1000), то все работает нормально.
А если пытаюсь microsoft.com, то если проверять такие порты,как 21-ftp
или 80-http по отдельности, то все работает.
Как только начинаю сканировать интервал ,например 80-81, прога виснет.
Подскажите почему?
Можно ли избежать зависания?
PM MAIL   Вверх
Johen
Дата 4.4.2005, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 25.5.2004
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Я думаю у тебя проблема с интервалом. Проверь цикл обхода номеров портов.

Скорее всего проблема не в этом, но вполне вероятно...
PM MAIL ICQ   Вверх
Leksey
Дата 5.4.2005, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: нет
Всего: 1



Но ведь для mail.ru все сканируется нормально в указанном промежутке и для vingrad.ru
получается от 1-1000 сканировать.
PM MAIL   Вверх
knave
Дата 15.4.2005, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 6.3.2003
Где: Санкт-Питербург ( Россия)

Репутация: 1
Всего: 5



Возможно закрыт доступ к портам. Ты пытаешся законектится и не можеш, а таймаут возможно не предусмотрел - вот и висиш.

Это сообщение отредактировал(а) knave - 15.4.2005, 13:44


--------------------
С наилучшими пожеланиями !!!
PM MAIL ICQ   Вверх
Coocky
Дата 15.4.2005, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: нет
Всего: 62



Leksey
с помощью чего писал?Если МФС-могу дать готовій сканер портов.Там раскоментишь пару строк,и увидишь чего виснет.Сканирует с 21 по 60000.......2 порта в секунду.Реализована многопоточность.


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Leksey
Дата 16.4.2005, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: нет
Всего: 1



Спасибо за советы Coocky и knave.Думал что никто уже не откликнется.
Пробавал yahoo.com тоже самое что с microsoft.com.
Coocky спасибо за предложения, но я пишу не с помощью MFC, а под UNIX, и многопоточность для меня- что-то очень далекое .
knave не мог бы ты мне подсказать как предусмотреть таймаут.
Заранее благодарен.
Вот собственно говоря и код:
Код

#include <stdlib.h>
#include <netdb.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

int main(int argc,char **argv)
{
 if (argc!=4)
  {
 
   printf("Usage: %s hostname n1 n2\n",argv[0]);
   printf("n1 - number of first port to scan.\n");
   printf("n2 - number of  last port to scan.\n");
   printf("Remark: n2 must be greater than n1.\n");
   return 1;
  }
  int    n1      = atoi(argv[2]);
  int    n2      = atoi(argv[3]);
  char  *hostname=argv[1];
  if (n1<=0||n2<=0||n1>n2) 
    {
     printf("Wrong parameters.\n");
     printf("use \"%s\" command without parameters for help.\n",argv[0]);
     return 2;
    } 
  hostent *hp=gethostbyname(hostname);
  if (!hp) 
  {
    printf("Host with name %s not found.\n",argv[1]);
    return 3;
  }
  sockaddr_in addr_in;
  in_addr ip;
  servent *serv;
  ip=*(in_addr*)*
  hp->h_addr_list;
  addr_in.sin_addr=ip;;
  addr_in.sin_family=AF_INET;
  for (int i=n1;i<=n2;i++)
  {
   int  s=socket(AF_INET,SOCK_STREAM,0);
   if (s==-1) { printf("Can't create socket!!!\n"); return 3; }                   
   addr_in.sin_port=i;

   if (!connect(s,(sockaddr*)&addr_in,sizeof(sockaddr)))
   {
     serv=getservbyport(i,0);
     if (!serv) printf("Port number: %.5d  Service name: unknown.\n",i);
    else    printf("Port number: %.5d  Service name: %s.\n",i,serv->s_name);
   }
   close(s);
  }
  return 0;
}

PM MAIL   Вверх
Leksey
Дата 20.4.2005, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: нет
Всего: 1



Люди кто знает что такое таймаут, который имел в виду knave и как его реализовать?

PM MAIL   Вверх
En_t_end
Дата 21.4.2005, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: нет
Всего: 20



Проблема была и есть и не только у систов. Помню как то Изатоп тоже на php с этим мучался, прога просто висла.
Сокеты вещь корявая, так что если ты хочешь юзать один сокет для подключения вида:
подсоединился->отправил->отсоединился
То тогда вместо close юзай shutdown.
Проблема в следующем сокет не успевает отконектиться от сервака, в виду того, что тот ему что-то ещё должен послать.... а тут как тут на него взваливается новое подключение. Причем для таких быстрых и не загруженных ресурсов, как vingrad сокет успевает получить все что нужно для разоединения и спокойно уйти в даун, а когда коннектишься к микрам, у них как всегда тормоза и твой сокет начинает колбасить. Короче вывод : для твоей задачи юзай shutdown.
Добавлено @ 08:01
Цитата
таймаут

Насколько мне известно, это когда ты программно спрашиаешь у сокета свободен ли он для нового подключения или нет, обычно засовывается в while(пока не доступен){}

PM MAIL ICQ Skype GTalk Jabber   Вверх
bilbobagginz
Дата 21.4.2005, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Leksey
Дата 21.4.2005, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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.
Да по ходу моя домашняя работа по компьютерным сетям набирает обороты...
PM MAIL   Вверх
En_t_end
Дата 22.4.2005, 06:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: нет
Всего: 20



bilbobagginz 
На счет микров --- Megaгон
1. Я не говорил бы так, если не проверял бы.
2. А проверял я следующим образом, одной своей простенькой прогой коннектился сначало к винграду а потом к микрам. Причем на действующий и работающий порт.
3. В этих испытаниях я заметил одну престанную вещь.... интервал между посылкой первого идентификационного пакета и конечным у микров составил около 15!!!! секунд, когда как винград откликнулся через 3 секунды. ЗЫ и удаленность тут ни причем, потому что коннектясь на орговские америкосовские ресурсы я получял ответ через 5 секунд.
Цитата
"сокеты микра" весят на 23 грамма

LOL я даже это в виду не имел smile
При чем тут это)))) ?
Проснись парень, скорость от обьема давно уже в большинстве случаев перестала зависеть.
PM MAIL ICQ Skype GTalk Jabber   Вверх
Arush
Дата 25.5.2005, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 10.11.2003

Репутация: нет
Всего: 1



Под рукой сейчас *nix нет - пишу по памяти, если что не так - звиняйте.

Насколько я помню это делалось так:
Заводишь себе массив сокетовю
Через setsockopt выставляешь сокетам опцию SO_NONBLOCK (сразу после создания). После этого когда ты вызовешь connect и тебе вернется ошибка EINPROGRESS - значит идет процесс соединения.
Затем используя select ты получаешь номера сокетов, состояние которых изменилось - т.е. произошло соединение, в соединении отказано, истек таймаут и т.п. Эти сокеты закрываешь, и пытаешься соединятся на следующие порты. И так пока не переберешь весь диапазон.
Где выставляется таймаут на соединение я не помню, но его можно эмулировать, заведя свой массив таймаутов и обновляя его после каждого вызова селект.

ЗЫ. Читайте доки - они рулез smile В info это должно быть вроде ветка libc, дальше не помню.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0539 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.