ネットランキング用のプログラムを作ってみる。
オレのサイトの各種ネットランキングを見ればわかるとおり、ほとんど誰も使っていなくてあらためてc++で作る意味が皆無に近いのだが、それでも作りたいというのがプログラマの心だろう。
今は誰にも相手にされず無視ゲー(みんなから無視されネットの海に消えていくあわれ極まりない悲惨なゴミゲーム、通称ウジ虫ゲーのこと。無視ゲーとはつまり「ウジ虫ゲーム」の略である)の烙印を押されているオレのゲームだが、いつの日か、ランキングcgiがアクセス過多になってサーバ会社から怒られるようなおもしろゲームを作るのがオレの目標である。
ちなみに、もう言わなくてもわかるだろうと思うが、このブログはオレがみなさんにプログラムを教えるという趣旨ではなく、オレが勉強していくというものである。口調が偉そうだからC++入門講座だと勘違いする人がいるかもしれない。しかし、オレは教える側ではなく教わる側なのだ。
勉強の過程で悩んだことを包み隠さず赤裸々に綴っていく、恥辱の羞恥ブログなのである!!
wininetというのを使うといいらしい。今回は、とりあえずデータのアップ&ダウンをするだけのプログラムを作ってみた。
BCC 5.5+BCC DEVELOPPER用
http://www.sm.rim.or.jp/~shishido/httpt.html
とりあえずここのサンプルを丸写ししてちょっとだけ改造した。丸写しとは情けないが、プログラムとはこうやっておぼえていくものである。
cgiに文字列を送るのは、文字列を付加したurlをオープンするだけでできる。掲示板書き込みとかをするのはもっとめんどくさいらしい。
プロジェクト→プロジェクト設定→アプリケーション「ターゲット」→コンソールアプリケーションで製作。
こんなこと言うまでもないが、なにを隠そうこのオレ坂葉晴雄は、はじめてc++に触れたときwindowsアプリケーションにしながら「main()」でプログラムを作り、ちっとも動かなくてかなり悩んだことがあるのだ! バカ丸出しさっさと死ねやこのボケナスカス大便!と言いたい方もいるだろうが、初心者とはつまりこういう部分がわからない人のことを指すのである。
・#include
・#include
の二つのファイルをインクルードする。wininet.hだけではだめらしい。
最初は
・外部シンボル ‘InternetOpenA’ が未解決
・外部シンボル ‘InternetOpenUrlA’ が未解決
・外部シンボル ‘InternetReadFile’ が未解決
・外部シンボル ‘InternetCloseHandle’ が未解決
が出て動かなかった。
いろいろ調べてみたところ、「wininet.lib」をコンパイラからリンクする必要があるらしい。
こういうのはパスが通ってて自動的にリンクしてくれるものだと思っていた。
「プロジェクトに追加」で追加するんじゃなくて、「プロジェクト設定」から追加する。
こういうところがまさに初心者。ベテランの方は、てめえのようなゴミクズがえらそうにプログラムについて書くんじゃねえよキモオタチンポ級の汚物!と思われたことだろう。しかし、こうして単純なミスを記しネットの大海に流しておくことが、キモオタチンポ級の汚物を減らし美しい社会を作ることに繋がると、オレは信じて疑わない。
BCC DEVELOPPERでは、プロジェクト→プロジェクト設定→リンクに「wininet.lib」を追加する
wininet.libは、うちの環境では「D:\borland\bcc55\Lib\」にあった。
エクスプローラのファイル名検索で見つかった。
検索するためには、適当なフォルダをエクスプローラで開き、おもむろに[F3]を押すのだ。すると検索コンパニオンというのが開くので、「ファイルとフォルダすべて」を選んで「winnet」とか入れて検索する。
いい加減にしろよこの脳味噌ゼロ的下等生物が!と思うのはわかる。だちょっと待ってほしい。これも知らない人がけっこういたりするのだ。たとえばこのオレ。知ったのはwinを使い出して何年かたったころで、それまではずっと、「マイコンピュータで右クリック→検索」を使っていたのだ。
ソースを張っておく。丸々コピペで動く。が、あらかじめcgiを作っておき、ローカルで動作させておく必要がある。
webサーバには、AN HTTPD DAEMON http://www.st.rim.or.jp/~nakata/ を使用した。perlもインストールしておく必要がある。
webサーバソフトの設定方法は、ソフトの解説を読もう。ここで説明したいが、もうだいぶ前に導入したのでやりかたを忘れた。けっこうめんどくさかった気がする。
AN HTTPDではオプションで指定したフォルダのルートが”http://localhost/”または”http://127.0.0.1/”というurlになる。デフォ ルトではインストールしたフォルダだったかな。つまり、http://localhost/ をホームページのルートのように扱えるわけだ。
サーバソフトを起動し「http://localhost/***.cgi」でアクセスするとcgiを実行できる。当たり前の話だが、ローカルで動作させる場合はパーミッションの設定は必要ない。なぜこんなことを書くのかというと、オレはパーミションの設定が必要だと思っていたからだ。本当にオレという男は頭が悪すぎる。
下のcgiをテストするときは http://localhost/data_save.cgi?manko とブラウザのurl欄に打ち込む。すると、cgiと同じフォルダにmankoと書かれたdata.logファイルが作成される。もしきみがエロい男ならば、ファイルを確認したとたん思わず勃起してしまうに違いない。
#include
using namespace std;
#include
#include
#include
#include
string name_url;
string name_cgi;
string name_log;
string updata;
void inet_up();// データアップ用関数
void inet_down();// データダウン用関数
int main() {
char input_data[256];// アップ用データ保存変数
name_url =”http://127.0.0.1/”;// urlの名前
name_cgi =”data_save.cgi?”;// cgiの名前
name_log =”data.log”;// ログファイルの名前
cin >> input_data;// アップ用データの入力
updata=input_data;// char型はstring型にそのまま渡せる
inet_up();// データアップロード
inet_down();// データダウンロード
return 0;
}
////////////////////////////////
// データアップロード関数
////////////////////////////////
void inet_up() {
HINTERNET hInet;// ネット接続用ハンドル宣言
HINTERNET hFile;// urlハンドル宣言
// ハンドル作成 ユーザーエージェント名 “data_up_down_test”
hInet=InternetOpen(“data_up_down_test”,INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
string url_cgi;
char url_cgi_ch[256];
// url設定
url_cgi=name_url+name_cgi+updata;
// InternetOpenUrlにstring型は渡せないのでchar型にする
strcpy(url_cgi_ch,url_cgi.c_str());
// URLオープン、データアップロード
// “***.cgi?###”をオープンすると、cgiに?以降の文字(###)を渡すことができる
// 今回の場合は、”http://127.0.0.1/data_save.cgi?###”の###を渡す。
// 「###」はcinで入力するchar input_data。
hFile=InternetOpenUrl(hInet,url_cgi_ch,NULL,0,INTERNET_FLAG_RELOAD,0);
// cgiのurlの表示
cout < < url_cgi_ch << '\r
';
// 終了処理
InternetCloseHandle(hFile);
InternetCloseHandle(hInet);
}
////////////////////////////////
// データダウンロード関数
////////////////////////////////
void inet_down() {
HINTERNET hInet;// ネット接続用ハンドル宣言
HINTERNET hFile;// urlハンドル宣言
LPTSTR lpszBuf;//データを読み込むバッファ
DWORD dwSize;//謎
string url_cgi;
char url_cgi_ch[256];
// 1024文字ぶんのバッファを用意
lpszBuf=(LPTSTR)GlobalAlloc(GPTR,1024);
// ハンドル作成 ユーザーエージェント名 "data_up_down_test"
hInet=InternetOpen("data_up_down_test",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
// url設定
url_cgi=name_url+name_log;
// InternetOpenUrlにstring型は渡せないのでchar型にする
strcpy(url_cgi_ch,url_cgi.c_str());
// URLオープン
hFile=InternetOpenUrl(hInet,url_cgi_ch,NULL,0,INTERNET_FLAG_RELOAD,0);
// ログファイルのurlの表示
cout << url_cgi_ch << '\r
';
// ファイル読み込み 1023文字読み込む
InternetReadFile(hFile,lpszBuf,1023,&dwSize);
cout << lpszBuf;
// 終了処理
InternetCloseHandle(hFile);
InternetCloseHandle(hInet);
}
/*
#///////////////////////////////////////////////////
# おまけ
# ログファイル記録用cgi
# 送られたデータをdata.logのファイル名で記録する
#///////////////////////////////////////////////////
#!/usr/local/bin/perl
# これがないとcgi単体で動かしたときエラーになる
# (無くても構わない)
print "Content-type: text/html\r
\r
";
# 「***.cgi?」以降の文字列を$dataに格納
$data = $ENV{ 'QUERY_STRING' };
# ログファイル名をdata.logにする
$fn="data.log";
# 書き込み用でファイルをオープン
open (OUT,">“,”$fn”);
#書き込む
print OUT $data;
#ファイルを閉じる
close(OUT);
exit;
*/
blind guardian
manticora
poison black
divine fire
ever grey
wuthering heights
参考になったらクリック!
2006 年 10 月 15 日
WEBサーバにデータを送信、受信してみる。
2 Comments »
RSS feed for comments on this post. TrackBack URL
非常に参考になりました。
ありがとうございます。
ただ、CGI作成時エラーが起きて苦戦してましたが
open (OUT,”>“,”$fn”);
↑”が、”に(全角)なってますよ。
コメント by Ma — 2009 年 5 月 15 日 @ 10:49:35
以前使っていたブログでは一部の半角記号が使えなかったので大文字で代用していました。
どうせ誰も見てないようなブログなので注意書きもせずそのままでした。
すみません。
あらためて見直したら、なぜか最後に購入予定のCDまで書いてあるし……。
コメント by 坂葉 — 2009 年 5 月 16 日 @ 20:44:41