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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сканирование подсети через связку fork - socket 
:(
    Опции темы
Rick
Дата 28.10.2011, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть wi-fi сеть. Есть айпады (на них открыты сокеты, слушающие 3333 порт, то есть по сути каждый айпад - сервер). Есть стационарная машина (по сути клиент). По необходимости она сканирует сеть (выполняет коннект), с целью определить, какие айпады сейчас в сети, а какие выключены.

Если опрашивать в цикле всю подсеть, то все проиходит корректно. Но данное решение не подходит в силу того, что если клиента нет в сети, то коннект с этим ip из-за таймаута блокирующего сокета будет идти очень долго.

Код

for (i = 1; i <= 254; i++)
{
            
             memset( &stIpadAddr, 0, sizeof( stIpadAddr ) );
              stIpadAddr.sin_family = PF_INET;
              stIpadAddr.sin_port = htons( 3333 );
        
             sprintf(ip_to_find, "10.0.1.%d", i);
      
             ipad_res = inet_pton( PF_INET, ip_to_find, &stIpadAddr.sin_addr );            
             IpadSocket = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP );
             connect(IpadSocket , (struct sockaddr*)&stIpadAddr, sizeof(stIpadAddr));        
             close(IpadSocket);
             
             
           
 }


Попробовал на каждый сокет выделить свой процесс

Код


for (i = 1; i <= 254; i++)
 {
           pid[i] = fork();
           if (pid[i] == 0)
           {      
                  memset( &stIpadAddr, 0, sizeof( stIpadAddr ) );
                  stIpadAddr.sin_family = PF_INET;
                  stIpadAddr.sin_port = htons( 3333 );
        
                  sprintf(ip_to_find, "10.0.1.%d", i);
      
                  ipad_res = inet_pton( PF_INET, ip_to_find, &stIpadAddr.sin_addr );            
                  IpadSocket = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP );
             
                  a = connect(IpadSocket , (struct sockaddr*)&stIpadAddr, sizeof(stIpadAddr));
                  printf("10.0.1.%d - %d", i, a);
                  close(IpadSocket);
                  exit(0);
         }    
          
           
}    



И вот здесь неприятное для меня открытие. Коннект не происходит с большей частью машин, которые в сети.
В чем дело подскажите, что я упустил из виду?

PS.  С неблокирующими сокетами та же история. (Приложение с одним процессом) Вначале в цикле на каждый ip создаю неблокирующий сокет и коннект, затем в цикле опрашиваю каждый коннект на предмет завершения. Клиент в сети, а коннекта с ним нет.


Это сообщение отредактировал(а) Rick - 29.10.2011, 06:30
--------------------
Не бывает атеистов в окопах под огнем   
PM MAIL ICQ   Вверх
Олег2005
Дата 28.10.2011, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

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



Ну, если говорить о TCP- то согласно протоколу коннектиться можно только к TCP-серверу.
указывая его IP и порт соединения.
Это означает - что на всех машинах, которые вы опрашиваете по TCP - должны работать TCP-сервера.
PM MAIL WWW MSN   Вверх
Rick
Дата 28.10.2011, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Олег2005, все верно. Я не теми именами назвал сущности, тем самым запутал, исправил.

Есть айпады (на них открыты сокеты, слушающие 3333 порт, то есть по сути каждый айпад - сервер). Есть стационарная машина (по сути клиент). По необходимости она сканирует сеть (выполняет коннект), с целью определить, какие айпады сейчас в сети, а какие выключены. 

Проблема в том, что если выполнять опрос с помощью блокирующего сокета в цикле - это работает, но очень долго (коннект с машиной в сети идет моменатально, а с выключенной 60 сек). Если использовать процессы, каждый из которых будет пытаться соединяться конкретным ip или если использовать неблокирующие сокеты, то почему-то периодически не проходят коннекты до айпадов которые в сети. smile 

Это сообщение отредактировал(а) Rick - 29.10.2011, 06:29
--------------------
Не бывает атеистов в окопах под огнем   
PM MAIL ICQ   Вверх
Олег2005
Дата 28.10.2011, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

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



Ну вот теперь все понятно.
Значит так.
Если машина работает в сети - то коннект с ней моментальный.
Если пытаемся соединиться с той машиной - которая не в сети - то коннект работает с внутренним таймаутом в 60 сек. Это тоже нормально - надо бы уточнить, какая ОС стоит на клиенте. 
В BSD - это 75 сек, в винде - 45 сек.
Поскольку ОС явно не винда (fork) - то использовать асаинхронный коннект WSAConnect() не представляется возможным.
Значит, следует смотреть или в сторону select(), или poll(), а лучше epoll().
это для уменьшения времени обнаружения неработающей машины.
Теперь - ситуация - машина в сети - а коннект не проходит.
Если тупо в цикле - все работает.
А вот по процессу на каждый IP - то проходит, то нет.
Сие науке неизвестно, почему - надо смотреть errno с кодами ошибок. С какой конкретно ошибкой завершается блокирующий коннект.
Вполне возможно, что превышаются какие-либо ограничения на таблицы открытых файлов(сокетов) или еще что для форканутого процесса.
Может надо делать shutdown()
Короче - ошибки в студию......
Да, и сколько айпадов максимально может присутствовать.....

Это сообщение отредактировал(а) Олег2005 - 28.10.2011, 20:42
PM MAIL WWW MSN   Вверх
Rick
Дата 29.10.2011, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



На стационарной машине Mac OS Lion, на айпадах ios 4.3.x
В сети может быть порядка 40-50 айпадов.

Боюсь сейчас наврать по кодам ошибок. В понедельник буду на работе, выдерну их.

IP адреса айпадам выдаются dhcp сервером. На выходных попробую покопать в эту сторону, если найду способ дергать актуальную arp-таблицу с сервера, то вопрос решится циклическим опросом через блокирующие сокеты.
--------------------
Не бывает атеистов в окопах под огнем   
PM MAIL ICQ   Вверх
Олег2005
Дата 31.10.2011, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

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



Цитата(Rick @  29.10.2011,  06:02 Найти цитируемый пост)
IP адреса айпадам выдаются dhcp сервером. 

Если опрос совпадает со временем обслуживания dhcp-клиента на айпаде?
В общем нужны ошибки.......
PM MAIL WWW MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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