Подключение сетевого кабеля
От: Divineshadow  
Дата: 11.05.05 02:17
Оценка:
Здравствуйте.

Написал функцию, с помощью которой можно узнать подключен ли сетевой кабель:
bool    IsPluged(int  Index)
{
    MIB_IFROW            iface;
    ZeroMemory(&iface, sizeof(iface));
    iface.dwIndex = Index;
    DWORD   dwRet;

    dwRet = GetIfEntry(&iface);
    if(dwRet==NO_ERROR)
        {
        if(iface.dwOperStatus==MIB_IF_OPER_STATUS_NON_OPERATIONAL) return false;
        if(iface.dwOperStatus==MIB_IF_OPER_STATUS_OPERATIONAL) return true;

        }
    return false;
}

где Index значение полуенное при помощи GetAdaptersInfo.
Функция работает на большинстве машин, но на некоторых выдаёт iface.dwOperStatus равным MIB_IF_OPER_STATUS_UNREACHABLE. Причём не важно вставлен сетевой кабель или нет.
Подскажите что нужно доработать в этой функции, что бы достоверно определять подключение сетевого кабеля.
Может есть совершенно другой способ?..
Re: Подключение сетевого кабеля
От: aik Австралия  
Дата: 11.05.05 06:08
Оценка:
Здравствуйте, Divineshadow, Вы писали:

D>Здравствуйте.


D>Написал функцию, с помощью которой можно узнать подключен ли сетевой кабель:

D>где Index значение полуенное при помощи GetAdaptersInfo.
D>Функция работает на большинстве машин, но на некоторых выдаёт iface.dwOperStatus равным MIB_IF_OPER_STATUS_UNREACHABLE. Причём не важно вставлен сетевой кабель или нет.
D>Подскажите что нужно доработать в этой функции, что бы достоверно определять подключение сетевого кабеля.
D>Может есть совершенно другой способ?..

попробуй через GetIpForwardTable. Ее нет если кабеля нет, если не путаю.
Какая вообще задача то стоит?
Re[2]: Подключение сетевого кабеля
От: Divineshadow  
Дата: 11.05.05 07:06
Оценка:
Здравствуйте, aik, Вы писали:


aik>попробуй через GetIpForwardTable. Ее нет если кабеля нет, если не путаю.

aik>Какая вообще задача то стоит?

Да вроде она остаётся когда кабеля нет. Пропадает когда сетевуха выключена.
Задача следующая: определить вставлен ли сетевой кабель в сетевую карту.
Re: Подключение сетевого кабеля
От: sercher Украина  
Дата: 11.05.05 07:41
Оценка:
D>Может есть совершенно другой способ?..

Надо попробывать сделать bind() сокету на IP адрес сетевого адаптера. Если кабель вытащен, то send()/recv()/connect()... выдаёт ошибку WSAENETDOWN или WSAETIMEDOUT ... а то может даже и bind() не сработает.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re: Подключение сетевого кабеля
От: SunChess  
Дата: 12.05.05 09:58
Оценка:
Все намного проще:

    DWORD Err;

    PFIXED_INFO pFixedInfo;
    DWORD FixedInfoSize = 0;

    PIP_ADAPTER_INFO pAdapterInfo, pAdapt;
    DWORD AdapterInfoSize;
    PIP_ADDR_STRING pAddrStr;

    if ((Err = GetNetworkParams(NULL, &FixedInfoSize)) != 0)
    {
        if (Err != ERROR_BUFFER_OVERFLOW)
        {
            printf("Error %d\n", Err);
            return;
        }
    }


Теперь нужно только эмпирически выяснить нужный (не подключен кабель) код ошибки — наизусть не помню.
Re[2]: Подключение сетевого кабеля
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 12.05.05 10:16
Оценка:
Здравствуйте, SunChess, Вы писали:

SC>Все намного проще:


GetNetworkParams() возвращает ERROR_BUFFER_OVERFLOW независимо от состояния кабеля
... << RSDN@Home 1.1.4 beta 7 rev. 451>>
Re[2]: Подключение сетевого кабеля
От: Divineshadow  
Дата: 13.05.05 03:47
Оценка:
Здравствуйте, SunChess, Вы писали:

SC>Теперь нужно только эмпирически выяснить нужный (не подключен кабель) код ошибки — наизусть не помню.


А как для каждого сетевого адаптера в отдельности таким способом не получиться выяснить ведь...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.