ちょっとしたHttpクライアント
昨日作ったクラスの雛形をもとにHTTPクライアントをクラス化(?)してみる。再利用できるといいんだけどなあ。
困ったことにvectorコンテナを返り値として返す方法が思いつかない(だからなぜかpublicのメンバ変数になっている)。調べればやり方はあるだろうのでまた更新する。
07/11追記:別にvectorコンテナを使う必要無かった。stringに詰め込めばいいのだ。といった感じでコードを書き直す。
/* * ReadHtml.cpp * * Created on: 2011/07/06 * Author: Nantonaku-Shiawase */ #include "ReadHtml.h" #include <iostream> #include <stdio.h> #include <windows.h> #include <WinInet.h> using namespace std; // メンバ変数に値を設定するSet関数 void ReadHtml::SetUrl(string inputUrlStr) { this->m_inputUrlStr = inputUrlStr; } // メンバ変数を返却するGet関数 string ReadHtml::GetUrl() { return this->m_inputUrlStr; } //HTTPClientを起動するメソッド int ReadHtml::StartHTTPClient() { HINTERNET hInet, hUrl; char szBuf[128]; DWORD dwRead , dwTotal = 0 ; //インターネット(WinInet)開始 hInet = InternetOpen("readhtml", INTERNET_OPEN_TYPE_PRECONFIG, NULL,NULL,0); if (hInet == NULL) { perror("オープンエラー\n"); return -2; } //HTTPセッションの開始、指定のURLオープン hUrl = InternetOpenUrl(hInet ,(LPCTSTR)this->m_inputUrlStr.c_str(),NULL,0,0,0); if (hUrl == NULL) { perror("URLオープンエラー\n"); InternetCloseHandle(hInet); return -3; } //読み出すものがなくなるまで読み出す while(1){ InternetReadFile( hUrl,szBuf,(DWORD)sizeof(szBuf) - 1 , &dwRead); szBuf[dwRead] = '\0'; //読み出すものがなくなったのでループ脱出 if (dwRead == 0) break; //必要バイト数の計算 dwTotal += dwRead; //一時保存用文字列 string tempBuf = szBuf; this->m_lpszSrc += tempBuf; } return 0; } string ReadHtml::GetHTTPString() { return this->m_lpszSrc; } // コンストラクタの定義 ReadHtml::ReadHtml(){ } // デストラクタの定義 ReadHtml::~ReadHtml(){ }
/* * ReadHtml.h * * Created on: 2011/07/06 * Author: Nantonaku-Shiawase */ #ifndef READHTML_H_ #define READHTML_H_ #include <iostream> #include <vector> #include <string> using namespace std; class ReadHtml { public: //コンストラクタ ReadHtml(); //デストラクタ ~ReadHtml(); //URLを設定するメソッド void SetUrl(string inputUrlStr); //クラス内部のURLに外からアクセスするメソッド string GetUrl(); //HTTPClientを起動するメソッド int StartHTTPClient(); //HTTP文を保持したコンテナに外からアクセスするメソッド string GetHTTPString(); private: //取得したHTML文を保持するメンバ変数 string m_lpszSrc; //URLを保持するメンバ変数 string m_inputUrlStr; }; #endif /* READHTML_H_ */
/* * main.cpp * * Created on: 2011/07/06 * Author: Nantonaku-Shiawase */ // main.cpp #include "ReadHtml.h" #include <iostream> void func(char *inputArgv); int main(int argc, char *argv[]) { if( argc != 2 ) { cout << "コマンドライン引数の数が不正です" << endl; return 1; } func(argv[1]); return 0; } void func(char *inputArgv) { ReadHtml rh; // コンストラクタ string inputUrlStr = inputArgv; // Set関数…ReadHtmlクラス内のメンバ変数に値を設定 rh.SetUrl( inputUrlStr ); // HTTPクライアントを起動 rh.StartHTTPClient(); // Get関数…ReadHtmlクラス内のメンバ変数から値を取得 cout << rh.GetHTTPString() << endl; } // ここでデストラクタが呼び出されるらしい
# Makefile CC = gcc TARGET = ReadHtml OBJECTS = main.o ReadHtml.o LIBS = -lwininet # all : $(TARGET) $(TARGET) : $(OBJECTS) $(CXX) $(OBJECTS) -o $(TARGET) $(LIBS) ReadHtml.o : ReadHtml.h g++ -c ReadHtml.cpp $(LIBS) main.o : ReadHtml.h g++ -c main.cpp $(LIBS) .PHONY: clean clean: rm -f *.o