当前位置:编程学习 > wap >>

如何检测到Windows Mobile手机是否已连接到网络(包括无线和有线) 急!!!

开发环境为Vs.net 2008 C#
我的程序需要调用网络服务,因此在程序执行时,需要检测程序是否已经连接到网络,如果连接则调用接口,否则提示用户将设备连接到网络(包括无线和有线)。
因为这个功能很急切,所以希望可以提供代码。如果分数不够,我继续加分;如果发现好贴,我会继续追加分。 --------------------编程问答-------------------- 用连接管理器相关的API就行了,CSDN上能找到相关的帖子 --------------------编程问答-------------------- 直接连 看有没有数据包  --------------------编程问答--------------------

/// <summary>This method performs a Web Request/Response process to see if there is network connectivity </summary> 
        /// <returns>Boolean that confirms if there is network connectivity </returns> 
        public static bool IsWebAccessible() 
        { 
            HttpWebRequest hwrRequest; 
            HttpWebResponse hwrResponse; 

            string strUrl = @"http://www.microsoft.com/"; 
            bool bConnected = false; 
            try 
            { 
                hwrRequest = (HttpWebRequest)WebRequest.Create(strUrl); 
                hwrRequest.Timeout = 10; 
                hwrResponse = (HttpWebResponse)hwrRequest.GetResponse(); 

                if (hwrResponse.StatusCode == HttpStatusCode.OK) 
                { 
                    bConnected = true; 
                } 
            } 
            catch (WebException we) 
            { 
                bConnected = false; 
            } 
            catch (Exception ex) 
            { 
                bConnected = false; 
            } 
            finally 
            { 
                hwrRequest = null; 
                hwrResponse = null; 
            } 
            return bConnected; 
        }
--------------------编程问答-------------------- 不知道手机上有没有pingAPI --------------------编程问答-------------------- gprsCoverageState = new SystemState(SystemProperty.PhoneGprsCoverage);
gprsCoverageState.Changed += OnCellPropertyChange; --------------------编程问答-------------------- TestPing(void)
{
DWORD dwData;
bool bResult = false;

dwData = 0;
const WCHAR c_szRVAL_INST[] = L"Instl";
LPWSTR  pszApp      = NULL;
    LPWSTR  pszExt      = NULL;
    DWORD   cbData      = 50;
    DWORD   dwType      = 0;
    long    lErr        = 0;
long     TotalTestTime = 0;
    long     TotalSize     = 0;
char    a[20];
//////////////////////////////////////////

CHAR cIPString[255];
CHAR cHostName[255];
TCHAR szUserEntry[255];
IPAddr ipaddr;  
WSADATA wsadata;
HOSTENT* pHostent = NULL;
IN_ADDR pInetAddr;

wsprintf(szUserEntry, m_strAPIP);//_T("169.254.242.16"));

wcstombs(cHostName, szUserEntry, 255);
//============================================================//
//Initiates use of ws2.dll
//============================================================//
if(WSAStartup(0x0101, &wsadata ) != 0) 
{
m_Winsock = _T("Socket Fail");
bResult = false;
return false;
}
else
{
m_Winsock = _T("Socket OK");
}

//============================================================//
//Retrieves host information corresponding to a host name from a host database
//============================================================//
if((pHostent = gethostbyname(cHostName)) == NULL)
{
strcpy(cIPString, cHostName);
}
else
{
char* pcDottedIP = NULL;
memcpy((void*)&pInetAddr, (void*)pHostent->h_addr_list[0], pHostent->h_length);
pcDottedIP = inet_ntoa(pInetAddr);
if(pcDottedIP)
{
strcpy(cIPString, pcDottedIP);
}
}

//*******************************************************************
// Now we ping the IP address resolved above
//*******************************************************************
// convert the IP char string to a IPAddr representation
ipaddr = inet_addr((const char*)cIPString);
if(ipaddr == INADDR_NONE)
{
m_CheckIP.SetWindowText( _T("Server IP NG"));
UpdateData(FALSE);
bResult = false;
}
else
{
m_CheckIP.SetWindowText( _T("Server IP OK"));
long iPacketSize = 1024;//
HANDLE hIcmp = IcmpCreateFile();
if(hIcmp == INVALID_HANDLE_VALUE)
{
m_ICMP = _T("ICMP NG");
UpdateData(FALSE);
bResult = false;
}
else
{
m_ICMP = _T("ICMP OK");
LPVOID lpData = NULL;
LPVOID lpRevBuffer = NULL;

lpData = new BYTE[iPacketSize];
memset(lpData,0,iPacketSize);
lpRevBuffer = new BYTE[sizeof(ICMP_ECHO_REPLY)*iPacketSize];
memset(lpRevBuffer,0,sizeof(ICMP_ECHO_REPLY)*iPacketSize);

GetDlgItem(IDC_EDIT1)->SetWindowText(m_strAPIP);
GetDlgItem(IDC_SOCKB)->SetWindowText(m_Winsock);
GetDlgItem(IDC_CHICMPB)->SetWindowText(m_ICMP);
UpdateData(TRUE);
if(lpData && lpRevBuffer)
{
TCHAR szFormattedOutputString[255];
ICMP_ECHO_REPLY* sIcmp; 
long lRtt;
long sDsz;
HWND hResultList = NULL;
for(INT i = 0; i < 4; i++)
{
// send the ping
if(IcmpSendEcho(hIcmp, ipaddr, lpData, iPacketSize, NULL, lpRevBuffer, (sizeof(ICMP_ECHO_REPLY)*iPacketSize), 2000) == NULL)
{
//m_Show.AddString(_T("Ping Fail"));
CString str;
str.Format(L"Ping Fail: %d",GetLastError());
myAddString(str);
//myAddString(_T("Ping Fail!"));
bResult = false;
}
else
{
// get the ping information and extract the round trip time and data size
sIcmp = (ICMP_ECHO_REPLY*)lpRevBuffer;
lRtt = sIcmp->RoundTripTime;
sDsz = sIcmp->DataSize; 
TotalTestTime += lRtt;

TotalSize +=sIcmp->DataSize;
m_Pocket = _itoa(TotalSize,a,10);
m_Time   = _itoa(TotalTestTime,a,10);
m_Rate   = _itoa(TotalSize/TotalTestTime*1000,a,10);

wsprintf(szFormattedOutputString, _T("RTT: %i ms, DataSize: %i bytes Success"), lRtt, sDsz);
myAddString(szFormattedOutputString);
bResult = true;
m_dwResTol++;
}
UpdateData(FALSE);
Sleep(250);
} // end for ping for loop
delete lpData;
delete lpRevBuffer;
}//end of ping data check
IcmpCloseHandle(hIcmp);
}
}
WSACleanup();
return bResult;
}
--------------------编程问答-------------------- Microsoft.WindowsMobile.Status.SystemState.ConnectionsCount > 0? --------------------编程问答-------------------- 我的程序参与网络调用的部分是调用webservice
运行环境为Windows Mobile 5或6

该种方法检测是否上网有点欠妥
希望进一步指导 --------------------编程问答-------------------- 访问一个特定的地址,成功就是已联网,失败就是未联网。这还用什么API嘛。 --------------------编程问答-------------------- 用  GetAPNFromEntryName  --------------------编程问答-------------------- 大家说的都不尽相同呀,呵呵。有线的好办,用微软的接口判断一下就可以了,无线的没用过,不知道可以不可以 --------------------编程问答-------------------- 我也关注这个问题,3楼的我试过,但是这种方法只能调用一次,如果再第二次调用的时候,程序就死那儿至少10秒以上。非常费劲。最后还抛出一个 timeout异常。所以说用http requst 不能取。
我还用过以下方法, 但是只能判断一次,举个列子。如果你的程序在wm上正常运行,而且也是联网的状态下。这时候,我人为的断网,它可以判断了,但是当我把网络连接好后,它还是一直未连接网络的状态。重启系统后再运行我的程序,还是一直提示没有连接网络。。。。



 #region 检查本机网络连接状态
      private const int INTERNET_CONNECTION_MODEM = 1;
       private const int INTERNET_CONNECTION_LAN = 2;
       [DllImport("winInet.dll")]
       private static extern bool InternetGetConnectedState(
       ref   int dwFlag,
       int dwReserved
       );   

       public static bool ConnNetStatus()
       {
           bool connNet = true;
           System.Int32 dwFlag = new int();
           if (!InternetGetConnectedState(ref   dwFlag, 0))
           {
               MessageBox.Show("没有网络连接\n请联系网络管理员修复!");
               connNet = false;
           }
           //else if ((dwFlag & INTERNET_CONNECTION_MODEM) != 0)
           //    MessageBox.Show("采用调治解调器上网。");
           //else if ((dwFlag & INTERNET_CONNECTION_LAN) != 0)
           //    MessageBox.Show("采用网卡上网。");   
           return connNet;
       }
       #endregion*/


--------------------编程问答-------------------- 因为是在VM 你人为断网的原因,所以检测不了.

--------------------编程问答-------------------- 我用的httprequest 挺好 --------------------编程问答-------------------- 取手机的ip地址,我就是这样做的。 --------------------编程问答-------------------- 这个坟挖得深了 。。。

引用 7 楼 roc196 的回复:
Microsoft.WindowsMobile.Status.SystemState.ConnectionsCount > 0?


经我测试,这个方法是可行的。
连接GPRS后 SystemState.ConnectionsCarllularCount = 1 ,SystemState.ConnectionsCarllularDescriptions = "GPRS连接名称"
连接WIFI后 SystemState.ConnectionsNetWorkCount = 1,SystemState.ConnectionsNetworkDescriptions = "无线网络名称"
这时SystemState.ConnectionsCount = 2 。

不过这只是判断连接是否已经建立,而不能判断是否真的可以上网。



--------------------编程问答-------------------- 楼主发表于:2009-03-18 17:44:56( 急!!!)
这么久还没结贴? --------------------编程问答-------------------- 用ping函数ping啊
补充:移动开发 ,  Windows Phone
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,