请问怎样实现程序优先使用wifi连接?

matrixcl 2010-11-25 03:13:07
现在做了一个程序,需要使用网络。

代码已经完成,使用网络时打开“Internet 设置”,已经正常工作。

现在要加新的需求,在wifi已经打开并可用的情况下,优先使用wifi;否则使用gprs。应该怎么做呢?


主要有这几个疑问:

1.wifi是否对应一种网络类型? 是“单位设置”吗?

2.怎么判断wifi是否已经打开?

3.怎么判断wifi是否可用,即可以访问外网的服务器?

附目前的打开网络连接代码

//目前pszConnName的默认值是L"Internet"
HRESULT CConnection::CreateConnectionByConnName(LPCTSTR pszConnName)
{
HRESULT hRet = E_FAIL;
CONNMGR_DESTINATION_INFO networkDestInfo = {0};

// 得到网络列表
for ( DWORD dwEnumIndex=0; ; dwEnumIndex++ )
{
memset ( &networkDestInfo, 0, sizeof(CONNMGR_DESTINATION_INFO) );
if ( ConnMgrEnumDestinations ( dwEnumIndex, &networkDestInfo ) == E_FAIL )
{
break;
}
if (_tcsstr(networkDestInfo.szDescription, pszConnName) != NULL)
{
CONNMGR_CONNECTIONINFO ConnInfo;
memset(&ConnInfo, 0, sizeof(CONNMGR_CONNECTIONINFO));
ConnInfo.cbSize = sizeof(ConnInfo);
ConnInfo.dwParams = CONNMGR_PARAM_GUIDDESTNET;
ConnInfo.dwFlags = 0;
ConnInfo.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE ;
ConnInfo.guidDestNet = networkDestInfo.guid;
return ConnMgrEstablishConnection(&ConnInfo, &m_hConnection);
}
}

return hRet;
}


谢谢给位不吝赐教
...全文
351 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ColaCoding 2011-05-11
  • 打赏
  • 举报
回复
收益非浅啊!谢谢!
lxpspring 2010-11-25
  • 打赏
  • 举报
回复
学习了~~~
matrixcl 2010-11-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lvlin1980 的回复:]
1. 是不是能访问公网取决于, 由接入点连接的局域网是不是能访问公网.

2. 一样, 那个函数可以用.

呵呵 , 答对的话 记得结帖哦 "结帖是种美德"
[/Quote]
兄弟放心,分不是问题 :)

lvlin1980 2010-11-25
  • 打赏
  • 举报
回复
1. 是不是能访问公网取决于, 由接入点连接的局域网是不是能访问公网.

2. 一样, 那个函数可以用.

呵呵 , 答对的话 记得结帖哦 "结帖是种美德"
matrixcl 2010-11-25
  • 打赏
  • 举报
回复
thanks lvlin1980

也就是说,同时满足这三个条件
StatusBuffer->dwConnectionStatus == CONNMGR_STATUS_CONNECTED
StatusBuffer->dwType == CM_CONNTYPE_NIC
StatusBuffer->dwSubtype == CM_CONNSUBTYPE_NIC_WIFI
就代表WiFi可用对吧?


另外还有两点疑惑
1.有没有可能可用的这个wifi接入点只是局域网接入点,访问不了公网服务器呢?(有没有ping之类的方法判断能否访问公网)

2.此时使用wifi就不需要想使用gprs一样,ConnMgrEstablishConnection 成功后才能用了,对吗?

lvlin1980 2010-11-25
  • 打赏
  • 举报
回复
这个问题我刚好之前做过, 其实, 挺简单的. 先判断下当前的网络连接状态就行.
参考代码:
// 判断WIFI状态,并选择网络
CONNMGR_CONNECTION_DETAILED_STATUS *StatusBuffer;
DWORD pcbBufferSize = 0;
ConnMgrQueryDetailedStatus(NULL, &pcbBufferSize);
StatusBuffer = (CONNMGR_CONNECTION_DETAILED_STATUS *)new BYTE[pcbBufferSize];
ConnMgrQueryDetailedStatus(StatusBuffer, &pcbBufferSize);

while(StatusBuffer != NULL)
{
if(StatusBuffer->dwConnectionStatus == CONNMGR_STATUS_CONNECTED)
{
switch(StatusBuffer->dwType)
{
case CM_CONNTYPE_NIC:
switch(StatusBuffer->dwSubtype)
{
case CM_CONNSUBTYPE_NIC_WIFI:
// AfxMessageBox(_T("智能选取连接\n成功(WIFI)!"));
g_isWifi = true;
break;
}
break;
// case CM_CONNTYPE_CELLULAR:
// switch(StatusBuffer->dwSubtype)
// {
// case CM_CONNSUBTYPE_CELLULAR_GPRS:
// AfxMessageBox(_T("智能选取连接\n成功(GPRS)!"));
// break;
// }
// break;
// case CM_CONNTYPE_PC:
// switch(StatusBuffer->dwSubtype)
// {
// case CM_CONNSUBTYPE_PC_DESKTOPPASSTHROUGH :
// AfxMessageBox(_T("智能选取连接\n成功(USB)!"));
// bIsUsb = TRUE;
// break;
// }
// break;
}
}
StatusBuffer = StatusBuffer->pNext;
}
delete StatusBuffer;
matrixcl 2010-11-25
  • 打赏
  • 举报
回复
谢谢YourKing。
这个函数是获取wifi连接状态的吧,能不能判断出这个连接能否访问外网呢(比如无线路由没接猫)?

另外建立wifi连接是我理解的那样吗?公司这边的wifi不能上外网,没法测试,faint。
YourKing 2010-11-25
  • 打赏
  • 举报
回复
ConnMgrQueryDetailedStatus
CONNMGR_CONNECTION_DETAILED_STATUS
dwType == CM_CONNTYPE_NIC
dwSubtype == CM_CONNSUBTYPE_NIC_WIFI

7,660

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧