簡易Webクライアントプログラムをつくってみる@

久しぶりのテクニック集だぁ、ふー。それはおいといて、ここではWinsockを使った簡易Webクライアントを作っていきたいと思って います。
このジャンルの最終目的は、簡易Webクライアントを作ってバッチ処理みたいなものを作ることです。 本当はブラウザを直接操作したかったのですが、現時点ではその方法が書いてある書籍等を入手できて いないので、ガリガリとソケットを使ってHTTPにのっとった通信プログラムを書いていきます。 ですから、ブラウザを操作できる方法が実装できそうな場合は横道にそれる可能性があることをご了承ください、というか それたいです。
そもそもWinsockに関しては1週間くらい前に書籍を見始めたくらいなので、テクニックというにはおこがましいですが 一緒に勉強していく位に考えてくださいね

それでは、始めましょう。 Webクライアントプログラムを作るには、WebサーバとHTTPにのっとって通信する 必要があります。あるHTMLファイルを入手するために必要な手順を挙げると

@ ソケットを使用可能な状態にする
A ソケットを作成してサーバ側と接続する
B HTTPにのっとったメッセージを送る
C サーバ側から送られてくるデータを受信する
 

といった感じになります。
今回はサーバ側に接続するときや、データを送受信するときにプロセス側に制御がかえらない ブロッキング状態については考えないことにしています。


ソケットを使用可能な状態にする

ソケットを使用可能な状態にするには、WSOCK32.LIBをリンクし,winsock.hをインクルードした上で WSAStartupを呼び出します。WSAStartupは

int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);

といった型の引数を必要とします。
wVersionRequestedは要求するWinsockのバージョンを設定します。1.1を使いますので MAKEWORD(1,1)と指定してください。WSADATA構造体はVC++のマニュアルに載ってますので各自調べてください。

尚、アプリケーションを終了させるときにはWSACleanup()を呼び出して、WSAStartupで割り当てたリソースを解放 します。


サーバ側と接続する

サーバ側と接続するためにはsocketで作成したソケットでconnectを使って接続します。 ソケットを作成するには

socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

と呼び出します。WebクライアントはTCP/IP通信ですのでこれで大丈夫です。返戻値が使用するSOCKETなので これを保存しておきましょう。
ここまでエラー処理を全然していませんが、最後のプログラムリストで説明したほうが よさそうなので割愛していきます。
次に、IPアドレスかホスト名で接続するホストを探します。gethostbynameやgethostbyaddrを使って調べます。 その他ポート番号などを必要なパラメータを全てセットしてconnectを呼び出します。
ここらへんの引数を説明すると長くなりそうなので次回にしましょう。動かしたいだけならソースコードを載せていますのでそちらを 参照してください。
データを送受信する

データを送信するためにはsendを使います。関数の型は

int send(SOCKET s,const char FAR * buf,int len,int flags );

となります。sには作成したソケット,bufには送信するデータを指すポインタ,lenには送信したい文字列 の長さ,flagsには0をいれておけば大丈夫です。返戻値には送信したデータの長さが返って来ます、ネットワーク の場合指定したデータが一気に送信できない(受信も)場合があるのでここで制御します。

データを受信する場合はrecvを使います。関数の型は

int recv (SOCKET s,char FAR * buf,int len,int flags);

sendと同じようなものです。recvはデータが送られてくるか、向こう側が コネクションを切断(返戻値 0)するかしないかぎり関数が終わりません。本来はこのブロッキング 状態を解消しなければならないんですが次回以降にします。

最後に接続を切断するのですが、HTTP 1.0を使ってGETメッセージを送るとサーバ側がデータ送信終了後 切断してしまうので、面倒くさい処理はせずclosesocket(SOCKET s)を呼んで切断します


書いてる途中でお腹がすいて、どうでもよくなってきていたので(すいません)これでは分からないと思います。 以下にサンプルプログラムを掲載し、次回に私と(も^^;)一緒に具体的な引数を勉強していきますのでそれで ご勘弁を。
ソースコードを見る

戻る