Как узнать, подключен ли я к сети или нет? - PullRequest
0 голосов
/ 06 марта 2012

Я использую .Net 4.0 в VS 2010. Я могу получить IP-адрес своей машины как

string hostname = Dns.getHostName();
IPHostEntry host = Dns.getHostEntry(hostname);

Теперь host.AddressList - это массив IP-адресов.

Iзаметил, что AddressList [0] ничего не содержит, AddressList [1] адрес обратной связи.Я не уверен насчет других индексов.

Если я создал сервер на одной машине, и он хочет заполнить свой IP-адрес клиенту (может быть только машиной), то какой IP-адрес (среди host.AddressList)я буду заселять?Какой индекс использовать?Как я узнаю, подключен ли я к локальной сети или Интернету, или не подключен вообще?Пожалуйста, уточните.

Ответы [ 3 ]

2 голосов
/ 06 марта 2012

Есть несколько способов сделать это (я думаю, вы можете использовать комбинацию [2] и [3]).

Раствор 1

Если вы включите ссылку на Microsoft.VisualBasic, вы можете использовать свойство Microsoft.VisualBasic.Devices.Network.IsAvailable, чтобы проверить, доступно ли сетевое соединение (и связанные события, которые будут уведомлены, когда это условие изменится).

Раствор 2

Импортируйте функцию API, чтобы проверить это:

[Flags]
enum InternetConnectionState : int
{
    INTERNET_CONNECTION_MODEM = 0x1,
    INTERNET_CONNECTION_LAN = 0x2,
    INTERNET_CONNECTION_PROXY = 0x4,
    INTERNET_RAS_INSTALLED = 0x10,
    INTERNET_CONNECTION_OFFLINE = 0x20,
    INTERNET_CONNECTION_CONFIGURED = 0x40
}

[DllImport("WININET", CharSet=CharSet.Auto)]
static extern bool InternetGetConnectedState(ref InternetConnectionState lpdwFlags, int dwReserved);

Или просто используйте функцию System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable() (лучшее решение, единственным недостатком является то, что он поддерживается в профиле клиента только с 4.0).

Решение 3

Пропингуйте известное имя хоста, например, Google или Microsoft (это также проверит DNS).

Пример * * тысяча двадцать-одна Используйте комбинацию вышеуказанных методов (в этом примере я использую импортированный API, но вы можете предпочесть другой). static class NetworkHelpers { public static bool IsNetworkConnectionAvailable() { InternetConnectionState state = InternetConnectionState.INTERNET_CONNECTION_OFFLINE; if (!InternetGetConnectedState(ref state, 0)) return false; if (state == InternetConnectionState.INTERNET_CONNECTION_OFFLINE) return false; try { System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping(); System.Net.NetworkInformation.PingReply reply = ping.Send(KnownHostName, PingTimeout); return reply.Status == System.Net.NetworkInformation.IPStatus.Success; } catch (System.Net.NetworkInformation.PingException) { return false; } } private const string KnownHostName = "http://www.microsoft.com"; private const int PingTimeout = 5000; // milliseconds [Flags] private enum InternetConnectionState : int { INTERNET_CONNECTION_MODEM = 0x1, INTERNET_CONNECTION_LAN = 0x2, INTERNET_CONNECTION_PROXY = 0x4, INTERNET_RAS_INSTALLED = 0x10, INTERNET_CONNECTION_OFFLINE = 0x20, INTERNET_CONNECTION_CONFIGURED = 0x40 } [System.Runtime.InteropServices.DllImport("WININET", CharSet = System.Runtime.InteropServices.CharSet.Auto)] private static extern bool InternetGetConnectedState(ref InternetConnectionState lpdwFlags, int dwReserved); }

2 голосов
/ 06 марта 2012

Возможно, это дубликат этого вопроса .

Не думайте, что вы подключены к Интернету (или любой другой сети) только из-за наличия действующего DNS-сервера или нескольких IP-адресов. Локальные ПК или маршрутизаторы могут выступать в качестве активного DNS и могут быть доступны даже без какого-либо подключения к Интернету или каких-либо других компьютеров в той же сети. Для возможных решений, посмотрите на вопрос / ответы, которые я связал выше. Есть также один или два примера только для обнаружения наличия активного сетевого подключения.

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

1 голос
/ 06 марта 2012

Состояние интернет-соединения можно легко найти с помощью этого:

[DllImport("wininet.dll", Charset = Charset.auto)]
private static extern bool InternetGetConnectedSate(ref InternetConnectionState_e lpdwFlags, int dwReserved);

, а затем, например:

if(InternetConnectionState_e.INTERNET_CONNECTION_PROXY) != 0)
{
    // do your internet stuff
}
...