「C言語/C++/WinHttpTest」の編集履歴(バックアップ)一覧はこちら

C言語/C++/WinHttpTest」(2012/09/07 (金) 17:45:45) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

|開発環境|Microsoft Visual C++ 2010 Express (SP1)| |実行環境|Microsoft Windows XP Home Edition (SP3)| |プロジェクトの種類|Win32 コンソール アプリケーション| |プロジェクト名|WinHttpTest| |アプリケーションの種類|コンソール アプリケーション| |追加のオプション|空のプロジェクト| |文字セット|Unicode| 参考 [[WinHTTP / GETによる取得>http://eternalwindows.jp/network/winhttp/winhttp01.html]] WinHttpTest.cpp #highlight(cpp){{ #pragma comment(lib, "winhttp.lib") #include <Windows.h> #include <winhttp.h> #include <tchar.h> #include <string> using namespace std; // 関数プロトタイプ宣言 void ReadData(HINTERNET hRequest); //============================================================================== int main() { HINTERNET hSession; HINTERNET hConnect; HINTERNET hRequest; URL_COMPONENTS urlc; DWORD data; DWORD dwSize = sizeof data; DWORD dw; BOOL b; // WinHTTPの初期化 hSession = WinHttpOpen( L"Sample Application/1.0", // pwszUserAgent WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, // dwAccessType WINHTTP_NO_PROXY_NAME, // pwszProxyName WINHTTP_NO_PROXY_BYPASS, // pwszProxyBypass 0); // dwFlags if (hSession == NULL) { return 1; } // インターネットオプションの問い合わせ b = WinHttpQueryOption(hSession, WINHTTP_OPTION_CONNECT_TIMEOUT, &data, &dwSize); if (b) { _tprintf(_T("CONNECT_TIMEOUT(msec) = [%u]\n"), data); } // URLをホスト名とパスに分割 ZeroMemory(&urlc, sizeof urlc); urlc.dwStructSize = sizeof urlc; urlc.dwHostNameLength = (DWORD)-1; urlc.dwUrlPathLength = (DWORD)-1; b = WinHttpCrackUrl( L"http://www.google.co.jp/", // pwszUrl 0, // dwUrlLength 0, // dwFlags &urlc); // lpUrlComponents if (!b) { return 1; } _tprintf(_T("lpszHostName = [%s]\n"), urlc.lpszHostName); _tprintf(_T("dwHostNameLength = [%u]\n"), urlc.dwHostNameLength); _tprintf(_T("nPort = [%u]\n"), urlc.nPort); _tprintf(_T("lpszUrlPath = [%s]\n"), urlc.lpszUrlPath); _tprintf(_T("dwUrlPathLength = [%u]\n"), urlc.dwUrlPathLength); // 得られた文字数で変数にコピー wstring strHostName(urlc.lpszHostName, urlc.dwHostNameLength); wstring strUrlPath(urlc.lpszUrlPath, urlc.dwUrlPathLength); // サーバーへの接続 hConnect = WinHttpConnect( hSession, // hSession strHostName.c_str(), // pswzServerName urlc.nPort, // nServerPort INTERNET_DEFAULT_PORT 0); // dwReserved if (hConnect == NULL) { dw = GetLastError(); switch (dw) { case ERROR_WINHTTP_INVALID_URL: _ftprintf(stderr, _T("WinHttpConnect = [INVALID_URL]\n")); break; default: _ftprintf(stderr, _T("WinHttpConnect = [%u]\n"), dw); } return 1; } // 要求ハンドルの取得 hRequest = WinHttpOpenRequest( hConnect, // hConnect NULL, // pwszVerb NULL=GET strUrlPath.c_str(), // pwszObjectName NULL, // pwszVersion NULL=HTTP/1.1 WINHTTP_NO_REFERER, // pwszReferrer WINHTTP_DEFAULT_ACCEPT_TYPES, // ppwszAcceptTypes 0); // dwFlags if (hConnect == NULL) { dw = GetLastError(); _ftprintf(stderr, _T("WinHttpOpenRequest = [%u]\n"), dw); return 1; } // 要求を送信 b = WinHttpSendRequest( hRequest, // hRequest WINHTTP_NO_ADDITIONAL_HEADERS, // pwszHeaders 0, // dwHeadersLength WINHTTP_NO_REQUEST_DATA, // lpOptional 0, // dwOptionalLength WINHTTP_IGNORE_REQUEST_TOTAL_LENGTH, // dwTotalLength 0); // dwContext if (!b) { dw = GetLastError(); _ftprintf(stderr, _T("WinHttpSendRequest = [%u]\n"), dw); return 1; } // 応答を待つ b = WinHttpReceiveResponse( hRequest, // hRequest NULL); // lpReserved // ヘッダ情報の取得 dwSize = 0; b = WinHttpQueryHeaders( hRequest, // hRequest WINHTTP_QUERY_RAW_HEADERS_CRLF, // dwInfoLevel WINHTTP_HEADER_NAME_BY_INDEX, // pwszName NULL, // lpBuffer &dwSize, // lpdwBufferLength WINHTTP_NO_HEADER_INDEX); // lpdwIndex if (!b) { dw = GetLastError(); switch (dw) { case ERROR_INSUFFICIENT_BUFFER: break; default: _ftprintf(stderr, _T("WinHttpQueryHeaders = [%u]\n"), dw); return 1; } } LPCWSTR lpHeader = new WCHAR[dwSize / sizeof (WCHAR)]; b = WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF, WINHTTP_HEADER_NAME_BY_INDEX, (LPVOID)lpHeader, &dwSize, WINHTTP_NO_HEADER_INDEX); if (!b) { dw = GetLastError(); _ftprintf(stderr, _T("WinHttpQueryHeaders = [%u]\n"), dw); return 1; } _tprintf(_T("lpHeader = [%s]\n"), lpHeader); delete [] lpHeader; // データの読み込み ReadData(hRequest); // 終了処理 b = WinHttpCloseHandle(hRequest); b = WinHttpCloseHandle(hConnect); b = WinHttpCloseHandle(hSession); return 0; } //------------------------------------------------------------------------------ void ReadData(HINTERNET hRequest) { BYTE buffer[4096]; DWORD dwSize; BOOL b; while (1) { // 入手可能データのバイト数を取得 b = WinHttpQueryDataAvailable(hRequest, &dwSize); if (dwSize == 0) break; if (_countof(buffer) < dwSize) dwSize = _countof(buffer); // データの読み込み b = WinHttpReadData(hRequest, buffer, dwSize, NULL); _tprintf(_T("%.*S"), dwSize, buffer); } } }}
|開発環境|Microsoft Visual C++ 2010 Express (SP1)| |実行環境|Microsoft Windows XP Home Edition (SP3)| |プロジェクトの種類|Win32 コンソール アプリケーション| |プロジェクト名|WinHttpTest| |アプリケーションの種類|コンソール アプリケーション| |追加のオプション|空のプロジェクト| |文字セット|Unicode| 参考 [[WinHTTP / GETによる取得>http://eternalwindows.jp/network/winhttp/winhttp01.html]] WinHttpTest.cpp #highlight(cpp){{ #pragma comment(lib, "winhttp.lib") #include <Windows.h> #include <winhttp.h> #include <tchar.h> #include <string> using namespace std; // 関数プロトタイプ宣言 BOOL GetRequest(HINTERNET hSession, LPCWSTR pwszUrl); BOOL ReadData(HINTERNET hRequest); //============================================================================== int main() { HINTERNET hSession; WCHAR wszUrl[256]; DWORD data; DWORD dwSize = sizeof data; BOOL b; int i; // ロケール定義 _tsetlocale(LC_CTYPE, _T("")); // WinHTTPの初期化 hSession = WinHttpOpen( L"Sample Application/1.0", // pwszUserAgent WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, // dwAccessType WINHTTP_NO_PROXY_NAME, // pwszProxyName WINHTTP_NO_PROXY_BYPASS, // pwszProxyBypass 0); // dwFlags if (hSession == NULL) { return 1; } // インターネットオプションの問い合わせ b = WinHttpQueryOption(hSession, WINHTTP_OPTION_CONNECT_TIMEOUT, &data, &dwSize); if (b) { _tprintf(_T("CONNECT_TIMEOUT(msec) = [%u]\n"), data); } while (1) { _tprintf(_T("\nURL(Ctrl-Zで終了)>")); i = _tscanf_s(_T("%s"), wszUrl, _countof(wszUrl)); if (i == EOF) break; if (i != 1) continue; GetRequest(hSession, wszUrl); } // 終了処理 b = WinHttpCloseHandle(hSession); return 0; } //------------------------------------------------------------------------------ BOOL GetRequest(HINTERNET hSession, LPCWSTR pwszUrl) { HINTERNET hConnect = NULL; HINTERNET hRequest = NULL; URL_COMPONENTS urlc; DWORD dwSize; DWORD dw; BOOL bRet = FALSE; BOOL b; // URLをホスト名とパスに分割 ZeroMemory(&urlc, sizeof urlc); urlc.dwStructSize = sizeof urlc; urlc.dwHostNameLength = (DWORD)-1; urlc.dwUrlPathLength = (DWORD)-1; b = WinHttpCrackUrl( pwszUrl, // pwszUrl 0, // dwUrlLength 0, // dwFlags &urlc); // lpUrlComponents if (!b) { return FALSE; } _tprintf(_T("lpszHostName = [%s]\n"), urlc.lpszHostName); _tprintf(_T("dwHostNameLength = [%u]\n"), urlc.dwHostNameLength); _tprintf(_T("nPort = [%u]\n"), urlc.nPort); _tprintf(_T("lpszUrlPath = [%s]\n"), urlc.lpszUrlPath); _tprintf(_T("dwUrlPathLength = [%u]\n"), urlc.dwUrlPathLength); // 得られた文字数で変数にコピー wstring strHostName(urlc.lpszHostName, urlc.dwHostNameLength); wstring strUrlPath(urlc.lpszUrlPath, urlc.dwUrlPathLength); // サーバーへの接続 hConnect = WinHttpConnect( hSession, // hSession strHostName.c_str(), // pswzServerName urlc.nPort, // nServerPort INTERNET_DEFAULT_PORT 0); // dwReserved if (hConnect == NULL) { dw = GetLastError(); switch (dw) { case ERROR_WINHTTP_INVALID_URL: _ftprintf(stderr, _T("WinHttpConnect = [INVALID_URL]\n")); break; default: _ftprintf(stderr, _T("WinHttpConnect = [%u]\n"), dw); } goto Exit; } // 要求ハンドルの取得 hRequest = WinHttpOpenRequest( hConnect, // hConnect NULL, // pwszVerb NULL=GET strUrlPath.c_str(), // pwszObjectName NULL, // pwszVersion NULL=HTTP/1.1 WINHTTP_NO_REFERER, // pwszReferrer WINHTTP_DEFAULT_ACCEPT_TYPES, // ppwszAcceptTypes 0); // dwFlags if (hConnect == NULL) { dw = GetLastError(); _ftprintf(stderr, _T("WinHttpOpenRequest = [%u]\n"), dw); goto Exit; } // 要求を送信 b = WinHttpSendRequest( hRequest, // hRequest WINHTTP_NO_ADDITIONAL_HEADERS, // pwszHeaders 0, // dwHeadersLength WINHTTP_NO_REQUEST_DATA, // lpOptional 0, // dwOptionalLength WINHTTP_IGNORE_REQUEST_TOTAL_LENGTH, // dwTotalLength 0); // dwContext if (!b) { dw = GetLastError(); _ftprintf(stderr, _T("WinHttpSendRequest = [%u]\n"), dw); goto Exit; } // 応答を待つ b = WinHttpReceiveResponse( hRequest, // hRequest NULL); // lpReserved // ヘッダ情報の取得 dwSize = 0; b = WinHttpQueryHeaders( hRequest, // hRequest WINHTTP_QUERY_RAW_HEADERS_CRLF, // dwInfoLevel WINHTTP_HEADER_NAME_BY_INDEX, // pwszName NULL, // lpBuffer &dwSize, // lpdwBufferLength WINHTTP_NO_HEADER_INDEX); // lpdwIndex if (!b) { dw = GetLastError(); switch (dw) { case ERROR_INSUFFICIENT_BUFFER: break; default: _ftprintf(stderr, _T("WinHttpQueryHeaders = [%u]\n"), dw); goto Exit; } } LPCWSTR lpHeader = new WCHAR[dwSize / sizeof (WCHAR)]; b = WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF, WINHTTP_HEADER_NAME_BY_INDEX, (LPVOID)lpHeader, &dwSize, WINHTTP_NO_HEADER_INDEX); if (!b) { dw = GetLastError(); _ftprintf(stderr, _T("WinHttpQueryHeaders = [%u]\n"), dw); goto Exit; } _tprintf(_T("lpHeader = [%s]\n"), lpHeader); delete [] lpHeader; // データの読み込み ReadData(hRequest); bRet = TRUE; Exit: // 終了処理 if (hRequest) b = WinHttpCloseHandle(hRequest); if (hConnect) b = WinHttpCloseHandle(hConnect); return bRet; } //------------------------------------------------------------------------------ BOOL ReadData(HINTERNET hRequest) { BYTE buffer[4096]; DWORD dwSize; BOOL b; // 一時的にロケールを変更 _tsetlocale(LC_CTYPE, _T("C")); while (1) { // 入手可能データのバイト数を取得 b = WinHttpQueryDataAvailable(hRequest, &dwSize); if (dwSize == 0) break; if (_countof(buffer) < dwSize) dwSize = _countof(buffer); // データの読み込み b = WinHttpReadData(hRequest, buffer, dwSize, NULL); _tprintf(_T("%.*S"), dwSize, buffer); } _tsetlocale(LC_CTYPE, _T("")); return TRUE; } }}

表示オプション

横に並べて表示:
変化行の前後のみ表示: