Re: Отследить пропадание сети
От: butcher Россия http://bu7cher.blogspot.com
Дата: 08.12.04 07:02
Оценка: 1 (1)
Здравствуйте, Niswn, Вы писали:

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

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

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

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

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

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

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