久しぶりのテクニック集だぁ、ふー。それはおいといて、ここではWinsockを使った簡易Webクライアントを作っていきたいと思って
います。
このジャンルの最終目的は、簡易Webクライアントを作ってバッチ処理みたいなものを作ることです。
本当はブラウザを直接操作したかったのですが、現時点ではその方法が書いてある書籍等を入手できて
いないので、ガリガリとソケットを使ってHTTPにのっとった通信プログラムを書いていきます。
ですから、ブラウザを操作できる方法が実装できそうな場合は横道にそれる可能性があることをご了承ください、というか
それたいです。
そもそもWinsockに関しては1週間くらい前に書籍を見始めたくらいなので、テクニックというにはおこがましいですが
一緒に勉強していく位に考えてくださいね
それでは、始めましょう。 Webクライアントプログラムを作るには、WebサーバとHTTPにのっとって通信する 必要があります。あるHTMLファイルを入手するために必要な手順を挙げると
といった感じになります。
今回はサーバ側に接続するときや、データを送受信するときにプロセス側に制御がかえらない
ブロッキング状態については考えないことにしています。
ソケットを使用可能な状態にするには、WSOCK32.LIBをリンクし,winsock.hをインクルードした上で WSAStartupを呼び出します。WSAStartupは
といった型の引数を必要とします。
wVersionRequestedは要求するWinsockのバージョンを設定します。1.1を使いますので
MAKEWORD(1,1)と指定してください。WSADATA構造体はVC++のマニュアルに載ってますので各自調べてください。
尚、アプリケーションを終了させるときにはWSACleanup()を呼び出して、WSAStartupで割り当てたリソースを解放 します。
サーバ側と接続するためにはsocketで作成したソケットでconnectを使って接続します。 ソケットを作成するには
データを送信するためにはsendを使います。関数の型は
となります。sには作成したソケット,bufには送信するデータを指すポインタ,lenには送信したい文字列 の長さ,flagsには0をいれておけば大丈夫です。返戻値には送信したデータの長さが返って来ます、ネットワーク の場合指定したデータが一気に送信できない(受信も)場合があるのでここで制御します。
データを受信する場合はrecvを使います。関数の型は
sendと同じようなものです。recvはデータが送られてくるか、向こう側が コネクションを切断(返戻値 0)するかしないかぎり関数が終わりません。本来はこのブロッキング 状態を解消しなければならないんですが次回以降にします。
最後に接続を切断するのですが、HTTP 1.0を使ってGETメッセージを送るとサーバ側がデータ送信終了後
切断してしまうので、面倒くさい処理はせずclosesocket(SOCKET s)を呼んで切断します