Здравствуйте, 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ке на соседней (по сети) машине работает