Windows Moblie上的网络连接与发短信的例子

来源:互联网 发布:菜鸟网络p7薪酬 编辑:程序博客网 时间:2024/06/05 03:46

在window mobile平台开发网络程序, 首先要建立网络连接(这点与windows pc编程不同).mobile 的sdk提供了一套这样的api来为我们服务. 要使用这套api, 需要引入头文件<Connmgr.h>.

一, 接入点的枚举.

HRESULT WINAPI ConnMgrEnumDestinations(
   int Index,
   CONNMGR_DESTINATION_INFO *pDestInfo);

下面这个函数是这个api的使用举例
void CConnectManager::EnumNetIdentifier ( OUT CStringArray &StrAry )
{
   CONNMGR_DESTINATION_INFO networkDestInfo = {0};

   // 得到网络列表
   for ( DWORD dwEnumIndex=0; ; dwEnumIndex++ )
   {
    memset ( &networkDestInfo, 0, sizeof(CONNMGR_DESTINATION_INFO) );
    if ( ConnMgrEnumDestinations ( dwEnumIndex, &networkDestInfo ) == E_FAIL )
    {
     break;
    }
    StrAry.Add ( networkDestInfo.szDescription );
   }
}

输出参数StrAry得到的是所有接入点的名称列表.在实际使用中, 往往会把这个列表通过ui显示出来, 让用户选择一个接入点.
所以这个StrAry里面接入点的顺序是很重要, 建立连接的时候我们要通过这里的顺序来确定用户选择的接入点的索引.

二, 建立网络连接

HRESULT WINAPI ConnMgrEstablishConnectionSync(
   CONNMGR_CONNECTIONINFO *pConnInfo,
   HANDLE *phConnection,
   DWORD dwTimeout,
   DWORD *pdwStatus);

这里用到的参数CONNMGR_CONNECTIONINFO *pConnInfo, 我们可以通过另一个api(ConnMgrEnumDestinations)来获取, 这个api的输入参数便是接入点的索引.
下面这个函数是这两个api的使用举例
BOOL CConnectManager::EstablishConnection ( DWORD dwIndex )
{
   // 得到正确的连接信息
   CONNMGR_DESTINATION_INFO DestInfo = {0};
   HRESULT hResult = ConnMgrEnumDestinations(dwIndex, &DestInfo);
   BOOL bRet = FALSE;
   if(SUCCEEDED(hResult))
   {
    // 初始化连接结构
    CONNMGR_CONNECTIONINFO ConnInfo;

    ZeroMemory(&ConnInfo, sizeof(ConnInfo));
    ConnInfo.cbSize = sizeof(ConnInfo);
    ConnInfo.dwParams = CONNMGR_PARAM_GUIDDESTNET;
    ConnInfo.dwFlags = CONNMGR_FLAG_PROXY_HTTP | CONNMGR_FLAG_PROXY_WAP | CONNMGR_FLAG_PROXY_SOCKS4 | CONNMGR_FLAG_PROXY_SOCKS5;
    ConnInfo.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE;
    ConnInfo.guidDestNet = DestInfo.guid;
    ConnInfo.bExclusive = FALSE;
    ConnInfo.bDisabled = FALSE;

    DWORD dwStatus = 0;
    hResult = ConnMgrEstablishConnectionSync(&ConnInfo, &m_hConnection, 10*1000, &dwStatus );
    if(FAILED(hResult))
    {
     m_hConnection = NULL;
    }
    else bRet = TRUE;
   }

   return bRet;
}

三 判断连接是否成功

使用ConnMgrEnumDestinations建立连接并返回TRUE之后, 并不能保证我们的连接真的建立成功了, 还需要使用下面的这个函数来判断.

HRESULT WINAPI ConnMgrConnectionStatus(
   HANDLE hConnection,
   DWORD *pdwStatus
   );

下面是这个api的使用
BOOL CConnectManager::WaitForConnected ( int nTimeoutSec, DWORD *pdwStatus/*=NULL*/ )
{
   DWORD dwStartTime = GetTickCount ();
   BOOL bRet = FALSE;
   while ( GetTickCount ()-dwStartTime < (DWORD)nTimeoutSec * 1000 )
   {
    if ( m_hConnection )
    {
     DWORD dwStatus = 0;
     HRESULT hr = ConnMgrConnectionStatus ( m_hConnection, &dwStatus );
     if ( pdwStatus ) *pdwStatus = dwStatus;
     if ( SUCCEEDED(hr) )
     {
      if ( dwStatus == CONNMGR_STATUS_CONNECTED )
      {
       bRet = TRUE;
       break;
      }
     }
    }
    Sleep ( 100 );
   }

   return bRet;
}

返回值为TRUE, 表示连接建立成功; 返回FALSE, 表示连接建立失败.
连接建立成功之后, 我们就可以开始网络编程了.
如果建立的是wap连接, 则我们可以去连接网关, 访问wap网站, 或者收发彩信.
如果建立的是net连接, 则我们可以像在pc上一样的做任何事情.

四 关于wap或net连接的区分.

在做一个彩信终端的时候, 需要完全在后台建立网络连接, 也就是说要程序自己选择接入点.
微软提供了一个api 来帮助我们选择合适的接入点.

HRESULT WINAPI ConnMgrMapURL(
   LPTSTR pwszURL,
   GUID *pguid,
   DWORD *pdwIndex
   );

但是这个api只是简单通过判断pwszURL地址的协议头来决定最好的接入点, 如pwszURL为 wsp://wap.baidu.com 则给你返回一个wap接入点.
如果pwszURL为 http://www.baidu.com 则给你返回一个net接入点.
至于这个接入点是否能够连接得上就不一定了.

我记得在net环境下, 连接10.0.0172网关是连接不上的. 于是我想通过连接网关来判断建立的链接是不是真wap连接, 但是后来发现这样不行, 因为有时候net环境下也能连接上网关.
联通的网关就更奇怪, 在net连接上, 不光能连上10.0.0.172:1920, 而且还能发送彩信成功.

至今没有找到好的判断的办法.

五 与pc同步之后的网络连接.

1 wm5.0及以下的设备与pc同步之后是不能建立无线网络连接的. 也就是说建立wap连接时肯定连接不上的, net连接可以建立, 但是走的不是gprs, 而是pc机的Internet网络.

2 wm6.0及以上的设备, 如果在ActiveSync的设置中没有选中"连接到台式计算机后, 允许在设备上建立无线连接"选项, 则情况和wm5.0及以下设备是一样的.
选中该选项之后则既可以建立wap连接, 也可以建立net连接, 而且也是走的gprs.

原创粉丝点击