![]() |
Модераторы: feodorv |
![]() ![]() ![]() |
|
Rick |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 4.11.2005 Где: Новосибирск Репутация: нет Всего: 3 |
Есть wi-fi сеть. Есть айпады (на них открыты сокеты, слушающие 3333 порт, то есть по сути каждый айпад - сервер). Есть стационарная машина (по сути клиент). По необходимости она сканирует сеть (выполняет коннект), с целью определить, какие айпады сейчас в сети, а какие выключены.
Если опрашивать в цикле всю подсеть, то все проиходит корректно. Но данное решение не подходит в силу того, что если клиента нет в сети, то коннект с этим ip из-за таймаута блокирующего сокета будет идти очень долго.
Попробовал на каждый сокет выделить свой процесс
И вот здесь неприятное для меня открытие. Коннект не происходит с большей частью машин, которые в сети. В чем дело подскажите, что я упустил из виду? PS. С неблокирующими сокетами та же история. (Приложение с одним процессом) Вначале в цикле на каждый ip создаю неблокирующий сокет и коннект, затем в цикле опрашиваю каждый коннект на предмет завершения. Клиент в сети, а коннекта с ним нет. Это сообщение отредактировал(а) Rick - 29.10.2011, 06:30 --------------------
Не бывает атеистов в окопах под огнем |
||||
|
|||||
Олег2005 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
Ну, если говорить о TCP- то согласно протоколу коннектиться можно только к TCP-серверу.
указывая его IP и порт соединения. Это означает - что на всех машинах, которые вы опрашиваете по TCP - должны работать TCP-сервера. |
|||
|
||||
Rick |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 4.11.2005 Где: Новосибирск Репутация: нет Всего: 3 |
Олег2005, все верно. Я не теми именами назвал сущности, тем самым запутал, исправил.
Есть айпады (на них открыты сокеты, слушающие 3333 порт, то есть по сути каждый айпад - сервер). Есть стационарная машина (по сути клиент). По необходимости она сканирует сеть (выполняет коннект), с целью определить, какие айпады сейчас в сети, а какие выключены. Проблема в том, что если выполнять опрос с помощью блокирующего сокета в цикле - это работает, но очень долго (коннект с машиной в сети идет моменатально, а с выключенной 60 сек). Если использовать процессы, каждый из которых будет пытаться соединяться конкретным ip или если использовать неблокирующие сокеты, то почему-то периодически не проходят коннекты до айпадов которые в сети. ![]() Это сообщение отредактировал(а) Rick - 29.10.2011, 06:29 --------------------
Не бывает атеистов в окопах под огнем |
|||
|
||||
Олег2005 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
Ну вот теперь все понятно.
Значит так. Если машина работает в сети - то коннект с ней моментальный. Если пытаемся соединиться с той машиной - которая не в сети - то коннект работает с внутренним таймаутом в 60 сек. Это тоже нормально - надо бы уточнить, какая ОС стоит на клиенте. В BSD - это 75 сек, в винде - 45 сек. Поскольку ОС явно не винда (fork) - то использовать асаинхронный коннект WSAConnect() не представляется возможным. Значит, следует смотреть или в сторону select(), или poll(), а лучше epoll(). это для уменьшения времени обнаружения неработающей машины. Теперь - ситуация - машина в сети - а коннект не проходит. Если тупо в цикле - все работает. А вот по процессу на каждый IP - то проходит, то нет. Сие науке неизвестно, почему - надо смотреть errno с кодами ошибок. С какой конкретно ошибкой завершается блокирующий коннект. Вполне возможно, что превышаются какие-либо ограничения на таблицы открытых файлов(сокетов) или еще что для форканутого процесса. Может надо делать shutdown() Короче - ошибки в студию...... Да, и сколько айпадов максимально может присутствовать..... Это сообщение отредактировал(а) Олег2005 - 28.10.2011, 20:42 |
|||
|
||||
Rick |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 4.11.2005 Где: Новосибирск Репутация: нет Всего: 3 |
На стационарной машине Mac OS Lion, на айпадах ios 4.3.x
В сети может быть порядка 40-50 айпадов. Боюсь сейчас наврать по кодам ошибок. В понедельник буду на работе, выдерну их. IP адреса айпадам выдаются dhcp сервером. На выходных попробую покопать в эту сторону, если найду способ дергать актуальную arp-таблицу с сервера, то вопрос решится циклическим опросом через блокирующие сокеты. --------------------
Не бывает атеистов в окопах под огнем |
|||
|
||||
Олег2005 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
||||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |