|
Winsock Programmer’s FAQ Examples: How to Check for a RAS Connection |
If you want to know whether the computer is “connected to the Internet,” what you often really want to know is whether there is a dial-up networking connection. This is accomplished with the Remote Access Service API, which is NT-speak for “Dial Up Networking.”)
See this FAQ item for the pitfalls with using this method to check for an Internet connection.
/***********************************************************************
rascheck.cpp - Check whether there is a RAS connection (Internet via
modem) on this machine, and if so whether it's up or not.
Original code by "Elmue", reformatted by Warren Young.
Build command: cl /GX rascheck.cpp
***********************************************************************/
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <iostream>
#include "rascheck.h"
using namespace std;
RasCheck::defConnStat RasCheck::pRasGetConnectStatus = 0;
RasCheck::defEnumConn RasCheck::pRasEnumConnections = 0;
// Loads RasAPI32.DLL and gets Entrypoints.
// creates public functions pRasGetConnectStatus and pRasEnumConnections
void
RasCheck::Init()
{
HINSTANCE hRasLib = LoadLibrary("RASAPI32.DLL");
if (hRasLib != 0) {
pRasGetConnectStatus =
(defConnStat)GetProcAddress(hRasLib,
"RasGetConnectStatusA");
pRasEnumConnections =
(defEnumConn)GetProcAddress(hRasLib,
"RasEnumConnectionsA");
}
}
// Returns the state of the modem connection. May return an error code if
// there is no RAS subsystem on this machine or something goes wrong
// while checking for the connection.
RasCheck::ConnectionState
RasCheck::Check()
{
if ((pRasGetConnectStatus == 0) || (pRasEnumConnections == 0)) {
return kNoRas;
}
DWORD nConnCount = 0;
DWORD nBufSize = sizeof(RASCONN);
LPRASCONN pRasBuf = (LPRASCONN)GlobalAlloc(GPTR, nBufSize);
pRasBuf->dwSize = nBufSize;
LPRASCONNSTATUS pStat = 0;
ConnectionState eRetVal = kDisconnected;
if (pRasEnumConnections(pRasBuf, &nBufSize, &nConnCount) == 0) {
// Got the list of RAS links, which may be empty. Try to find one
// that's currently connected.
pStat = (LPRASCONNSTATUS)GlobalAlloc(GPTR,
sizeof(RASCONNSTATUS));
for (DWORD i = 0; i < nConnCount; ++i, ++pRasBuf) {
pStat->dwSize = sizeof(RASCONNSTATUS);
if (pRasGetConnectStatus(pRasBuf->hrasconn, pStat) == 0) {
if ((pStat->dwError == 0) &&
(pStat->rasconnstate == RASCS_Connected)) {
eRetVal = kConnected;
break;
}
}
}
}
else {
eRetVal = kError;
}
GlobalFree(pStat);
GlobalFree(pRasBuf);
return eRetVal;
}
#if 1 // change to 0 to compile as part of another program
int
main()
{
RasCheck ras;
ras.Init();
switch (ras.Check()) {
case RasCheck::kConnected:
cout << "RAS connection is up." << endl;
break;
case RasCheck::kDisconnected:
cout << "RAS connection is down." << endl;
break;
case RasCheck::kNoRas:
cout << "No RAS present on this machine." << endl;
break;
case RasCheck::kError:
cout << "Failure while checking RAS connections." << endl;
break;
}
return 0;
}
#endif
#if !defined(RASCHECK_H)
#define RASCHECK_H
#include <ras.h>
#include <string>
class RasCheck
{
public:
enum ConnectionState {
kConnected,
kDisconnected,
kNoRas,
kError
};
static void Init();
ConnectionState Check();
private:
typedef DWORD(WINAPI * defConnStat) (HRASCONN, LPRASCONNSTATUS);
typedef DWORD(WINAPI * defEnumConn) (LPRASCONN, LPDWORD, LPDWORD);
static defConnStat pRasGetConnectStatus;
static defEnumConn pRasEnumConnections;
};
#endif // !defined(RASCHECK_H)
|
<< How to Packetize a TCP Stream |
Articles >> |
| Updated Fri Dec 16 2022 12:23 MST | Go to my home page |