Re[2]: Отследить пропадание сети
От: savosin_sergey  
Дата: 08.12.04 14:50
Оценка:
Здравствуйте, butcher, Вы писали:

B>Здравствуйте, Niswn, Вы писали:


N>>Как бы мне оследить пропадание сети программно? В виндах при пропадании сети внизу справа на панеле загорается значек "Сеть недоступна" (скажем если выдернуть сетевой шнур из компа).

N>>Есть ли какая-нибудь апишная функция или событие, которые информируют об этом?

B>
B>#include    <winsock2.h>
B>#include    <iostream>

B>#pragma        comment(lib, "ws2_32.lib")

B>int main(void)
B>{
B>    using            std::cout;
B>    using            std::cerr;
B>    using            std::endl;
B>    WSADATA            wd;
B>    SOCKET            sock;
B>    int                nRet;
B>    SOCKADDR_IN        saddr;

B>    if((nRet = WSAStartup(MAKEWORD(2, 0),&wd)) != 0){
B>        cerr << "WSAStartup fail with code " << nRet << endl;
B>        return -1;
B>    }
B>    sock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
B>    if(sock == INVALID_SOCKET){
B>        cerr << "socket fail with code " << WSAGetLastError() << endl;
B>        return -2;
B>    }
B>    ZeroMemory(&saddr, sizeof(SOCKADDR_IN));
B>    saddr.sin_addr.s_addr = htonl(INADDR_ANY);
B>    saddr.sin_family = AF_INET;
B>    saddr.sin_port = htons(5678);
B>    if(bind(sock, reinterpret_cast<SOCKADDR*>(&saddr), sizeof(SOCKADDR_IN)) != SOCKET_ERROR)
B>    {
B>        WSAEVENT    hEvent;
B>        DWORD        dw = 0;
B>        char        *buf = 0;
B>        hEvent = WSACreateEvent();
B>        nRet = WSAEventSelect(sock, hEvent, FD_ROUTING_INTERFACE_CHANGE);
B>        nRet = WSAIoctl(sock, SIO_ROUTING_INTERFACE_CHANGE, reinterpret_cast<char*>(&saddr), 
B>            sizeof(saddr), buf, 0, &dw, 0, 0);
B>        nRet = WSAGetLastError();
B>        nRet = WaitForSingleObject(hEvent, INFINITE);
B>        if(nRet == 0){
B>            cout << "Что-то с интерфейсом!!!" << endl;
B>        }
B>        WSACloseEvent(hEvent);
B>    }else{
B>        cerr << "bind fail with code " << WSAGetLastError() << endl;
B>    }
B>    closesocket(sock);
B>    WSACleanup ();
    
B>    return 0;
B>}
B>

здорово! только под winnt не работает (в цикле ждёт неисправности сети), хотя на 2000ке на соседней (по сети) машине работает
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.