如何检测到Windows Mobile手机是否已连接到网络(包括无线和有线) 急!!!
开发环境为Vs.net 2008 C#我的程序需要调用网络服务,因此在程序执行时,需要检测程序是否已经连接到网络,如果连接则调用接口,否则提示用户将设备连接到网络(包括无线和有线)。
因为这个功能很急切,所以希望可以提供代码。如果分数不够,我继续加分;如果发现好贴,我会继续追加分。 --------------------编程问答-------------------- 用连接管理器相关的API就行了,CSDN上能找到相关的帖子 --------------------编程问答-------------------- 直接连 看有没有数据包 --------------------编程问答--------------------
--------------------编程问答-------------------- 不知道手机上有没有pingAPI --------------------编程问答-------------------- gprsCoverageState = new SystemState(SystemProperty.PhoneGprsCoverage);
/// <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;
}
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地址,我就是这样做的。 --------------------编程问答-------------------- 这个坟挖得深了 。。。
经我测试,这个方法是可行的。
连接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