如何以编程方式检查我的机器是否可以使用 C/C++ 访问 Internet,这只是 ping IP 的问题吗?网卡是如何做到的?我的意思是:
我正在使用 Windows 7。
如何以编程方式检查我的机器是否可以使用 C/C++ 访问 Internet,这只是 ping IP 的问题吗?网卡是如何做到的?我的意思是:
我正在使用 Windows 7。
如果你在 Windows 上工作,试试这个
#include <iostream>
#include <windows.h>
#include <wininet.h>
using namespace std;
int main(){
if(InternetCheckConnection(L"http://www.google.com",FLAG_ICC_FORCE_CONNECTION,0))
{
cout << "connected to internet";
}
return 0;
}
我认为没有那种东西,但你可以试试这个:
最简单的方法是尝试连接到已知的外部 IP 地址。
如果在 Windows 中失败,connect 函数会返回SOCKET_ERROR
,并且WSAGetLastError
通常会返回WSAEHOSTUNREACH
(意味着无法将数据包发送到主机)。
在 Linux 中,您将返回 a -1
,而 errno 将是ENETUNREACH
. 一些有用的链接:
除了 InternetCheckConnection() 函数之外,Win32 API 还具有一个函数 ( InternetGetConnectedState() ),它为某种形式的 Internet 连接(可用性)返回真/假:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa384702(v=vs.85).aspx
它还告诉您您拥有的互联网连接类型(LAN、调制解调器、代理等)——这通常很容易知道。
实际上有一个非常聪明的方法,包括这里的代码片段。
它基本上使用cmd选项: While in CMD hit: route print
.
这将使用数组映射路由表,并将查找 0.0.0.0 作为可用的 Internet 连接。
我用它和一个while(true){//the code in here } //check for inet connection , else will sleep for 10 mins and check again
根据 Microsoft API 文档,不推荐使用InternetCheckConnection。
[InternetCheckConnection 可用于“要求”部分中指定的操作系统。在后续版本中可能会更改或不可用。相反,请使用 NetworkInformation.GetInternetConnectionProfile 或 NLM 接口。]
除了这个 API,我们可以使用INetworkListManager接口来检查 Windows 平台是否连接了 Internet。
下面是win32代码库:
#include <iostream>
#include <ObjBase.h> // include the base COM header
#include <Netlistmgr.h>
// Instruct linker to link to the required COM libraries
#pragma comment(lib, "ole32.lib")
using namespace std;
enum class INTERNET_STATUS
{
CONNECTED,
DISCONNECTED,
CONNECTED_TO_LOCAL,
CONNECTION_ERROR
};
INTERNET_STATUS IsConnectedToInternet();
int main()
{
INTERNET_STATUS connectedStatus = INTERNET_STATUS::CONNECTION_ERROR;
connectedStatus = IsConnectedToInternet();
switch (connectedStatus)
{
case INTERNET_STATUS::CONNECTED:
cout << "Connected to the internet" << endl;
break;
case INTERNET_STATUS::DISCONNECTED:
cout << "Internet is not available" << endl;
break;
case INTERNET_STATUS::CONNECTED_TO_LOCAL:
cout << "Connected to the local network." << endl;
break;
case INTERNET_STATUS::CONNECTION_ERROR:
default:
cout << "Unknown error has been occurred." << endl;
break;
}
}
INTERNET_STATUS IsConnectedToInternet()
{
INTERNET_STATUS connectedStatus = INTERNET_STATUS::CONNECTION_ERROR;
HRESULT hr = S_FALSE;
try
{
hr = CoInitialize(NULL);
if (SUCCEEDED(hr))
{
INetworkListManager* pNetworkListManager;
hr = CoCreateInstance(CLSID_NetworkListManager, NULL, CLSCTX_ALL, __uuidof(INetworkListManager), (LPVOID*)&pNetworkListManager);
if (SUCCEEDED(hr))
{
NLM_CONNECTIVITY nlmConnectivity = NLM_CONNECTIVITY::NLM_CONNECTIVITY_DISCONNECTED;
VARIANT_BOOL isConnected = VARIANT_FALSE;
hr = pNetworkListManager->get_IsConnectedToInternet(&isConnected);
if (SUCCEEDED(hr))
{
if (isConnected == VARIANT_TRUE)
connectedStatus = INTERNET_STATUS::CONNECTED;
else
connectedStatus = INTERNET_STATUS::DISCONNECTED;
}
if (isConnected == VARIANT_FALSE && SUCCEEDED(pNetworkListManager->GetConnectivity(&nlmConnectivity)))
{
if (nlmConnectivity & (NLM_CONNECTIVITY_IPV4_LOCALNETWORK | NLM_CONNECTIVITY_IPV4_SUBNET | NLM_CONNECTIVITY_IPV6_LOCALNETWORK | NLM_CONNECTIVITY_IPV6_SUBNET))
{
connectedStatus = INTERNET_STATUS::CONNECTED_TO_LOCAL;
}
}
pNetworkListManager->Release();
}
}
CoUninitialize();
}
catch (...)
{
connectedStatus = INTERNET_STATUS::CONNECTION_ERROR;
}
return connectedStatus;
}
如果您在 Windows 上,以下代码将起作用:
#include <iostream>
#include <windows.h>
int main(){
if (system("ping www.google.com")){
std::cout<<"\nNot connnected to the internet\n\n";
}
else{
std::cout<<"\nConnected to the internet\n\n";
}
system("pause");
return 0;
}