Здравствуйте, 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;
}