新闻中心

EEPW首页>嵌入式系统>设计应用> GPRS开发系列文章之进阶篇

GPRS开发系列文章之进阶篇

作者: 时间:2016-10-08 来源:网络 收藏

HRESULT WINAPI ConnMgrReleaseConnection( HANDLE hConnection,BOOL bCache );

【连接管理API大致使用步骤】:

首先我们利用ConnMgrApiReadyEvent()函数来确认是否有可用连接,如果有可用连接我们则利用ConnMgrEnumDestinations()函数枚举所有可用连接,然后遍历所有连接调用我们的同步或异步连接方法ConnMgrEstablishConnectionSync()与ConnMgrEstablishConnection()来发起连接,一旦连接成功后我们就可以进行我们伟大的下一步了,就是和我们的服务器进行通信。

【GPRS demo效果图】

【GPRSDemo介绍】

GPRSDemo主要利用了上述的几个重要的API函数来获取当前可用连接,并自动选择一个最佳的连接途径,然后启用这个连接,在连接启动成功以后再用socket 进行网络连接,与公网服务器进行通信。

首先检查是否有可用连接

BOOL CConnectManager::GetConnMgrAvailable()

{

HANDLE hConnMgr = ConnMgrApiReadyEvent ();

BOOL bAvailbale = FALSE;

DWORD dwResult = ::WaitForSingleObject ( hConnMgr, 2000 );

if ( dwResult == WAIT_OBJECT_0 )

{

bAvailbale = TRUE;

}

// 关闭

if ( hConnMgr ) CloseHandle ( hConnMgr );

return bAvailbale;

}

然后枚举所有可用连接:

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 );

}

}

接下来找到“Internet”这个连接,可用远程URL映射的方式来完成,这样可以让系统自动选取一个最好的连接。

int CConnectManager::MapURLAndGUID ( LPCTSTR lpszURL, OUT GUID guidNetworkObject, OUT CString *pcsDesc/*=NULL*/ )

{

if ( !lpszURL || lstrlen(lpszURL) 1 )

return FALSE;

memset ( guidNetworkObject, 0, sizeof(GUID) );

int nIndex = 0;

HRESULT hResult = ConnMgrMapURL ( lpszURL, guidNetworkObject, (DWORD*)nIndex );

if ( FAILED(hResult) )

{

nIndex = -1;

DWORD dwLastError = GetLastError ();

AfxMessageBox ( _T(Could not map a request to a network identifier) );

}

else

{

if ( pcsDesc )

{

CONNMGR_DESTINATION_INFO DestInfo = {0};

if ( SUCCEEDED(ConnMgrEnumDestinations(nIndex, DestInfo)) )

{

*pcsDesc = DestInfo.szDescription;

}

}

}

return nIndex;

}

最后启用指定编号的连接并检查连接状态

BOOL CConnectManager::EstablishConnection ( DWORD dwIndex )

{

// 释放之前的连接

ReleaseConnection ();

// 得到正确的连接信息

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;

}

检测连接状态

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;

}

最后要记得释放连接

void CConnectManager::ReleaseConnection ()

{

if ( m_hConnection )

{

ConnMgrReleaseConnection(m_hConnection, FALSE);

m_hConnection = NULL;

}

}

2. 客户端与服务器端进行socket通信APIsocket通信相关开发API在Winsock2.h.文件中定义,因为SOCKET通信不是本文的重点但是又是必须要涉及的



关键词:

评论


相关推荐

技术专区

关闭