アットウィキロゴ
 
#include <windows.h>
#include <stdio.h>
#include <wininet.h>
#pragma comment(lib,"WinInet.Lib")

int main()
{
     HINTERNET hInternet;
     HINTERNET hHttpSession;
     HINTERNET hHttpRequest;
     char *Buf;
     char BufSizeText[1000];
     DWORD BufSizeTextSize = 1000;
     DWORD BufSize;
     DWORD ReadSize;
     // ヘッダ
     char *contentHeader = "Content-Type: application/x-www-form-urlencoded\n";
     // リクエスト送信するパラメタ
     char *data ="name=gotoji";

     /* WININET初期化 */
     hInternet = InternetOpen(
         "WinInet-Test",                    // User-Agent
         INTERNET_OPEN_TYPE_PROXY,            // プロクシを経由する
         "172.16.32.2:10080",                // プロクシサーバのアドレス:ポート番号
         "localhost",                        // (オプションの)ローカルでの既知のホスト名またはIPアドレスのリスト
         0);                                // Win32インターネット関数の振る舞いを指定するフラグ
    if(hInternet == NULL){
        perror("オープンエラー\n");
        return 1;
    }


     /* サーバへ接続 */
    hHttpSession = InternetConnect(
        hInternet,
        "localhost",                        // サーバのホスト名
        8080,                                // ポート番号
        "",                                    // ユーザ名
        "",                                    // パスワード
        INTERNET_SERVICE_HTTP,                // アクセスするサービスのタイプ(HTTP,FTP etc..)
        0,                                    // サービス固有のフラグ値
        0);                                    // コールバック関数に渡されるアプリケーション定義の32bit値

    if( hHttpSession == NULL ){
        perror("サーバへの接続エラー\n");
        return 1;
    }

 
     /* HTTP要求の作成 */
    hHttpRequest = HttpOpenRequest(
         hHttpSession,                 
         "POST",                            // POST or GET
         "/ASP/winInetAction.do",            // 取得したい対象物
         NULL,                                // HTTPのバージョン
         NULL,                                // 対象物の位置(URL)
         NULL,                                // メディアのタイプ
         INTERNET_FLAG_RELOAD,                // 要求に関するフラグ
         0);                                // コールバックに渡されるアプリケーション定義の値

    if( hHttpRequest == NULL ){
        perror("HTTP要求の作成エラー\n");
        return 1;
    }

     /* 作成したHTTP要求の発行 */
    if( !HttpSendRequest(
            hHttpRequest,
            contentHeader,                    // 追加のヘッダ
            strlen(contentHeader),            // ヘッダのサイズ
            data,                            // 要求ヘッダ後に直接送信されるオプションのデータ。通常POSTやPUTで使用される
            strlen(data) )){                // オプションのデータサイズ
                perror("HTTP要求の発行ができません\n");
                return 1;
    }
 
    /* 返されたコンテンツの長さを取得 */
    if( !HttpQueryInfo(
             hHttpRequest,
             HTTP_QUERY_CONTENT_LENGTH,        // 取得する属性や、要求の変更などのレベルを表すフラグ
             BufSizeText,                    // 取得したデータ(取得した結果)
             &BufSizeTextSize,                // 取得したデータのサイズ(Bufのサイズ)
             NULL) ){                        // 同一のヘッダが存在する場合にどのヘッダかを識別するためのインデックス
                 perror("コンテンツが取得できません。\n");
                 return 1;
    }
    // long型に変換
    BufSize = atol(BufSizeText);
    Buf = GlobalAlloc(GMEM_FIXED, BufSize);
 
    /* コンテンツの内容を取得 */
    if( !InternetReadFile(
            hHttpRequest,
            Buf,                            // 読み込み結果のデータ
            BufSize,                        // Bufのサイズ
            &ReadSize) ){                    // 実際に読み込まれたデータのサイズ
                perror("コンテンツは空です。\n");
                return 1;
    }
    /* コンテンツの表示 */
    printf("%s\n", Buf);
 
    /* 後処理 */
    GlobalFree(Buf);   
    InternetCloseHandle(hHttpRequest);
    InternetCloseHandle(hHttpSession);
    InternetCloseHandle(hInternet);

    return 0;
}

1. 使用上の注意・補足

 

       使用できるプロトコルは Https, Http, Ftp, Gopherのみである。

 

       WinInet.Libへのリンクに関してソース上に #paragma commentで指定するか、VC++ [プロジェクト] [~のプロパティ] [構成プロパティ] [リンカ] [入力] から[追加の依存ファイル] “WinInet.Lib” と入力し、設定する。

 

       VC++を使用する場合は [プロジェクト] [~のプロパティ] [構成プロパティ] [全般] から文字セットを [Unicode文字セットをしようする] から [マルチバイト文字セットを使用する] に変更することで動作した。

最終更新:2007年05月16日 18:48