プログラムテクニックメモ(2001/07/18) 
 

TCP/IPでHTTPポートにアクセスする

TCP/IPを使ったソケット通信でHTTPポート(80)にアクセスするには、相手先のIP取得(gethostbyname)、ソケットの作成(socket)、サーバとの接続(connect)、データ送信(send)、データ受信(recv)、ソケットの終了(close)の関数を使用します。またここでのアクセス方法は、クライアント・サーバモデルのクライアント側アクセスとなります。

C言語からのアクセス方法

上記で羅列した関数コマンドを使用することにより、HTTP サーバにアクセスすることができますが、ファイア・ウォールで守られた LAN 環境からのアクセスは proxy(プロキシ) を通じて行われるので注意が必要です。

通常の場合、相手先のIP取得(gethostbyname) → ソケットの作成(socket) → サーバとの接続(connect) → データ送信(send) → データ受信(recv) → ソケットの終了(close)を行います。

proxy 経由の場合は、プロキシのIP取得(gethostbyname) → ソケットの作成(socket) → サーバとの接続(connect) → データ送信(send) → データ受信(recv) → ソケットの終了(close)と、始めに接続するサーバが、実際の相手先ではなく proxy と言う点が違います。これは、ファイア・ウォールで守られた LAN 環境では、外部のサーバとのやりとりは全て proxy 経由で行われるためなのです。会社で 「web を見たいのだったら、IEの proxy に xxxx っていれてね!」って言われるのは、このせいなのです。 

また proxy 経由でのアクセスの場合、HTTP の GET/POST メソッド指定に対し、相手先 web サーバの指定をパラメタとして発行しなくてはいけないのです(ピンク色の部分)。

proxy 経由で無い場合

  GET / HTTP/1.0

proxy 経由の場合

  GET http://www.sea-bird.org/ HTTP/1.0

サンプルプログラム

HTTP サーバに対して、通常/proxy 経由でアクセスし、そのデータ内容を取得する簡単なサンプルプログラムを作成してみました。このプログラムは、エラー処理等本当に最低限しかしておりませんので、このサンプルをそのまま流用することは避けてください。またこのプログラムに対してのクレームは、認めませんのでよろしくお願いします。ソース

とりあえず使い勝手を優先するため、関数形式にしました。指定するパラメタによって、通常/proxy 経由でアクセスを切り替えています。

ConnectHost_t host;

host.proxy_name          proxyホスト名  :proxy経由で無い場合は、指定しない
host.proxy_port          proxyポート番号:proxy経由で無い場合は、指定しない
host.server_name         HTTPサーバ名   :
host.url                 取得したいurl
host.method              メソッド       :"GET" か "POST" を指定
host.data                パラメタ

←topへ