2009年8月21日 星期五

如何建立連線

一、建立GPRS連線
1. AttemptConnect
BOOL bAvailable = FALSE;

HANDLE hConn = NULL;
CONNMGR_CONNECTIONINFO ci = { 0 };
ci.cbSize = sizeof(ci);
ci.dwParams = CONNMGR_PARAM_GUIDDESTNET CONNMGR_PARAM_MAXCONNLATENCY;
ci.dwFlags = CONNMGR_FLAG_PROXY_HTTP CONNMGR_FLAG_PROXY_WAP CONNMGR_FLAG_PROXY_SOCKS4 CONNMGR_FLAG_PROXY_SOCKS5;
ci.ulMaxConnLatency = 4000; // 4 second
ci.bDisabled = TRUE;
ci.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE;
ci.guidDestNet = GetNetworkGuid();
if (SUCCEEDED(hr = ConnMgrEstablishConnection(&ci, &hConn)))
{
DWORD dwResult = WaitForSingleObject(hConn, 400);
switch (dwResult)
{
case WAIT_OBJECT_0:
{
DWORD dwStatus;
if( SUCCEEDED(ConnMgrConnectionStatus(hConn, &dwStatus)) && ( (dwStatus == CONNMGR_STATUS_CONNECTED) (dwStatus == CONNMGR_STATUS_CONNECTIONDISABLED) ))
{
hr = S_OK;
CheckForRequiredProxy(hConn);
}
else
{
hr = S_FALSE;
}
break;
}
case WAIT_TIMEOUT:
hr = E_FAIL;
break;
}
ConnMgrReleaseConnection(hConn, FALSE);
}

2. QueryProxy
BOOL bHasProxy = FALSE;
HKEY hKey;
DWORD dwSize = 0, dwType = 0;

wcscpy(m_wszCurrConnectKey, TEXT("Comm\\ConnMgr\\Providers\\{EF097F4C-DC4B-4c98-8FF6-AEF805DC0E8E}\\"));
目前連線相關設定值都會設在HKEY_LOCAL_MACHINE下\Comm\ConnMgr\Providers\{EF097F4C-DC4B-4c98-8FF6-AEF805DC0E8E}
HKEY_LOCAL_MACHINE下\Comm\ConnMgr\Providers\下有許多組GUID, EF097F4C-DC4B-4c98-8FF6-AEF805DC0E8E是指目前連線那一組


if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, m_wszCurrConnectKey, 0, 0, &hKey))
//Proxy

抓出目前連線的proxy設定值

dwSize = MAX_LOADSTRING * sizeof(TCHAR);
wmemset(m_wszProxy, 0, sizeof(m_wszProxy));
if(RegQueryValueEx(hKey, _T("Proxy"), NULL, &dwType, (LPBYTE)m_wszProxy, &dwSize) == ERROR_SUCCESS)
{
if((wcscmp(m_wszProxy, _T("")) != 0) && (wcscmp(m_wszProxy, _T("new-inet:1159")) != 0))
bHasProxy = TRUE;
}
else
{
RETAILMSG(TRUE, (_T("RegQueryValueEx m_wszProxy is fail")));
}
RegCloseKey(hKey);
}

3.SetProxyToInternet

連線至internet時,若有proxy則須多設proxy至registry,利用InternetSetOption可以將proxy值自動設定到registry,若沒有設定或設定錯誤,在InternetOpenUrl會return error.

INTERNET_PER_CONN_OPTION_LIST List;
INTERNET_PER_CONN_OPTION Option[1];
unsigned long nSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);

Option[0].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
Option[0].Value.pszValue = m_wszProxy;

List.dwSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);
List.pszConnection = NULL;
List.dwOptionCount = 1;
List.dwOptionError = 0;
List.pOptions = Option;

if(!InternetSetOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &List, nSize))
RETAILMSG(TRUE, (_T("InternetSetOption set INTERNET_OPTION_PER_CONNECTION_OPTION failed! (%d)\n"), GetLastError()));

二、 連線至網際網路
if(!g_bHasProxy)
hOpen = InternetOpen (TEXT("ceHttp"), INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
else
hOpen = InternetOpen (TEXT("ceHttp"), INTERNET_OPEN_TYPE_PROXY, g_wszProxy, g_wszProxy, 0);

有無proxy的設定值必須不同,此proxy的值是查詢registry所得.

hRequest = InternetOpenUrl (hOpen, lpszServer, NULL,0,
INTERNET_FLAG_EXISTING_CONNECT, 0);
HttpSendRequest (hRequest, NULL, 0, NULL, 0);
hAppend = CreateFile (XTRAFILE_PATH, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
dwPos = SetFilePointer (hAppend, 0, NULL, FILE_END);

char szBuffTemp[MAX_FILE_READ_WIN_MOBILE];
int i=0;
int iTotalBytesRecvd=0;
while (InternetReadFile(hRequest, (LPVOID)szBuffTemp, 4096, &dwSize))
{
if(dwSize ==0)
break;
WriteFile (hAppend, szBuffTemp,dwSize,&dwBytesWritten, NULL);
iTotalBytesRecvd=iTotalBytesRecvd+dwSize;// To do: store file content somewhere:

}
CloseHandle (hAppend);
InternetCloseHandle (hOpen);
InternetCloseHandle (hRequest);