checknetwork.cpp
来自「funambol window mobile客户端源代码」· C++ 代码 · 共 171 行
CPP
171 行
/*
* Funambol is a mobile platform developed by Funambol, Inc.
* Copyright (C) 2003 - 2007 Funambol, Inc.
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU Affero General Public License version 3 as published by
* the Free Software Foundation with the addition of the following permission
* added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED
* WORK IN WHICH THE COPYRIGHT IS OWNED BY FUNAMBOL, FUNAMBOL DISCLAIMS THE
* WARRANTY OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program; if not, see http://www.gnu.org/licenses or write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA.
*
* You can contact Funambol, Inc. headquarters at 643 Bair Island Road, Suite
* 305, Redwood City, CA 94063, USA, or at email address info@funambol.com.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License version 3.
*
* In accordance with Section 7(b) of the GNU Affero General Public License
* version 3, these Appropriate Legal Notices must retain the display of the
* "Powered by Funambol" logo. If the display of the logo is not reasonably
* feasible for technical reasons, the Appropriate Legal Notices must display
* the words "Powered by Funambol".
*/
// checknet.cpp : test network status.
//
#include <winsock2.h>
#include <ws2tcpip.h>
#include <windows.h>
#include <tchar.h>
#include "base/util/utils.h"
struct in_addr BIN_IPV4_ADDR_LOOPBACK = {127, 0, 0, 1};
struct in6_addr BIN_IPV6_ADDR_LOOPBACK = { 0x0, 0x0,
0x0, 0x0,
0x0, 0x0,
0x0, 0x0,
0x0, 0x0,
0x0, 0x0,
0x0, 0x0,
0x0, 0x1 };
#define MAX_LOCAL_NAME_LEN 64
static char localAddress[64] = "0.0.0.0";
static void Print(TCHAR *pFormat, ...) {
va_list ArgList;
TCHAR Buffer[256];
va_start (ArgList, pFormat);
(void)wvsprintf (Buffer, pFormat, ArgList);
va_end(ArgList);
}
//Function Prototypes
bool IsNetPresent();
const char* getLocalAddress()
{
return localAddress;
}
void getIPAddress(wchar_t* address) {
wchar_t* t = toWideChar(localAddress);
wcscpy (address, t);
delete [] t;
}
bool checkNetwork()
{
WSADATA WSAData;
WSAStartup(MAKEWORD(2,2), &WSAData);
bool ret = IsNetPresent();
WSACleanup();
return ret;
}
//
// Determine if you have a IPv4 or IPv6 network address.
//
bool IsNetPresent()
{
bool bFoundLocalAddr = false;
char szAddrASCII[MAX_LOCAL_NAME_LEN];
ADDRINFO AddrHints, *pAI, *pAddrInfo;
//
// Get the local host's name in ASCII text.
//
if(gethostname(szAddrASCII, MAX_LOCAL_NAME_LEN - 1))
{
return false;
}
//
// To obtain a list of all the local
// addresses, resolve the local name with getaddrinfo for all
// protocol families.
//
memset(&AddrHints, 0, sizeof(AddrHints));
AddrHints.ai_family = PF_UNSPEC;
AddrHints.ai_flags = AI_PASSIVE;
if(getaddrinfo(szAddrASCII, "10", &AddrHints, &pAddrInfo))
{
return false;
}
//
// Search the addresses returned.
// If any of them match the loopback address, then
// are not connected to an outside network.
//
// Note: This will not tell you how many networks you
// are connected to. If one or more networks are present,
// then the loopback addresses will not be included in the
// list returned from getaddrinfo.
//
bFoundLocalAddr = true;
for(pAI = pAddrInfo; pAI != NULL && bFoundLocalAddr; pAI = pAI->ai_next)
{
if(pAI->ai_family == PF_INET)
{
SOCKADDR_IN *addr = (SOCKADDR_IN *)(pAI->ai_addr);
sprintf(localAddress, "%d.%d.%d.%d",
addr->sin_addr.S_un.S_un_b.s_b1,
addr->sin_addr.S_un.S_un_b.s_b2,
addr->sin_addr.S_un.S_un_b.s_b3,
addr->sin_addr.S_un.S_un_b.s_b4);
if(memcmp(&(addr->sin_addr),
&BIN_IPV4_ADDR_LOOPBACK,
sizeof(BIN_IPV4_ADDR_LOOPBACK)) == 0)
bFoundLocalAddr = false;
}
else if(pAI->ai_family == PF_INET6)
{
SOCKADDR_IN6 *addr = (SOCKADDR_IN6 *)(pAI->ai_addr);
if(memcmp(&(addr->sin6_addr),
&BIN_IPV6_ADDR_LOOPBACK,
sizeof(BIN_IPV6_ADDR_LOOPBACK)) == 0)
bFoundLocalAddr = false;
}
}
freeaddrinfo(pAddrInfo);
return bFoundLocalAddr;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?