C / C ++ определяет тип сети - PullRequest
       29

C / C ++ определяет тип сети

0 голосов
/ 14 февраля 2011

Мне нужно написать приложение win32 c / c ++, которое сможет определить, подключен ли ПК, на котором он работает, к одной из 2 сетей. Первая сеть - это локальная сеть компании (которая не имеет подключения к Интернету), а вторая - автономный коммутатор, к которому подключен один ПК (ПК, на котором запущена программа).

Я довольно новичок в сетевом программировании, но до сих пор я пытался проверить, можно ли подключить сетевой диск, который находится в нашей локальной сети. Это прекрасно работает, если ПК подключен к локальной сети, сопоставление дисков выполнено успешно, поэтому обнаружение локальной сети прошло успешно. Однако, если ПК подключен к коммутатору, это приводит к ОЧЕНЬ длинному таймауту, который не подходит, так как задержит программу настолько, что сделает ее непригодной для использования.

У кого-нибудь есть альтернативные предложения?

Я использую c / c ++ в VS 6.0

[Update]

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

(1) Вышеупомянутая ЛВС вообще не имеет внешних подключений, она полностью изолирована, поэтому невозможно разрешение внешних DNS или пингующих веб-сайтов.

(2) Имя хоста, MAC-адрес, IP-адрес, шлюз по умолчанию, подсеть и т. Д. (В основном все, что вы видите в ipconfig -all), все настраиваются вручную (не динамически от маршрутизатора), поэтому проверка любой из этих настроек вернет то же самое подключен ли он к локальной сети или к коммутатору.

(3) Из-за пункта (2) любые попытки связаться с коммутатором кажутся безуспешными, фактически почти все сетевые команды (ping, arp и т. Д.) Кажутся неудачными - я думаю, что из-за машины, пытающейся подключиться в ЛВС, когда его там нет: - (

Одна вещь, которую я нашел, которая работает - это пинг IP-адреса шлюза по умолчанию, который истекает при подключении к коммутатору. Это нормально, так как я могу сократить время ожидания пинга, чтобы он не зависал целую вечность, а был немного хак, и я, безусловно, был бы признателен за любые лучшие решения.

Спасибо

Ответы [ 3 ]

1 голос
/ 14 февраля 2011

Что касается TCP / IP, в глобальной сети нет такой вещи, как локальная сеть.Существует ряд маршрутизируемых адресов, не относящихся к Интернету, таких как 192.168.xx и 10.xxx, но иногда они используются интернет-провайдером, не имея IP-адресов.

Лучше всего при использовании соединений TCP / IP использовать асинхронный API,WIN32 определяет целую кучу ПЕРЕКРЫТЫХ API для этой цели.Это предотвратит остановку вашего приложения во время ожидания удаленного соединения.

В качестве альтернативы поместите содержимое сокета в другой поток, а затем только уведомите пользовательский интерфейс, когда операция будет завершена.

0 голосов
/ 16 февраля 2011

Различные вещи, на которые вы можете посмотреть для дифференциации:

DNS domain name (GetComputerNameEx)
MAC address of gateway (ping it, then GetIpNetTable)
Routing table(do you have a gateway and default route on the company LAN)
WNet discovered network resources (WNetOpenEnum, WNetEnumResource)
Ability to resolve external hostnames (try a 5-10 names like www.google.com, www.microsoft.com and so on, if one resolves you should have internet)

Вам нужно будет решить, сколько индикаторов «достаточно», чтобы определить, находитесь ли вы в одной или другой локальной сети, если тесты не пройдены.Затем продолжайте повторять, пока не получите определенный результат.

http://msdn.microsoft.com/en-us/library/aa366071%28v=VS.85%29.aspx имеет множество сетевых функций, с которыми вы можете поэкспериментировать, чтобы создать дополнительные индикаторы.

0 голосов
/ 14 февраля 2011

Сначала я бы попытался провести различие между ними, используя информацию, доступную локально, то есть с вашего компьютера. Выходной сигнал ipconfig /all отличается в зависимости от того, к какой сети вы подключены? Если это так, воспользуйтесь этой разницей, если можете.

Можно ли получить MAC-адрес автономного коммутатора? Из коммутатора, который управляет локальной сетью компании? Это был бы верный способ сказать. Если кто-то не клонировал MAC-адрес.

Если вы попытаетесь использовать существование или отсутствие какого-либо сетевого сервиса для определения, к какой сети вы подключены, вы никогда не сможете быть уверены. Например, если вам не удалось сопоставить этот сетевой диск, все, что вы знаете, это то, что сетевой диск недоступен. Вы не можете с уверенностью сказать, что вы не подключены к локальной сети компании. То же самое верно, если вы используете пинг. Отсутствие ответа от конкретной машины означает только то, что машина не ответила.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...