ありがとうございました。 やってみます。 |
はじめましてつると申します。 ネットワークプログラムについての質問なのですが、 今、いろいろと事情があって ここのページを参考にプロキシのようなサーバプログラムを 作成しております。 なにをするサーバかというと、ブラウザからのリクエストを受け取り そのリクエスト(GET,POST)を他のWebサーバにそのまま送りつけ そのWebサーバからのレスポンス(HTML)を受け取り、 ブラウザに返してやるサーバです。 このページのソースを参考にしています。 サーバ部分はecho-server.plを httpリクエスト部分はhttp-client.plを利用しましたが、 Webサーバまではリクエストが行っているようですが レスポンスがうまく表示されません。 なにか原因がわかりになるようでしたら 教えてください。 |
ソースはこんな感じです。 #!/usr/local/bin/perl -w use Socket; $server_port = 4989; # ソケット生成 socket(CLIENT_WAITING,PF_INET,SOCK_STREAM,0) || die "ソケットを生成できません。$!"; # ソケットオプション設定 setsockopt(CLIENT_WAITING,SOL_SOCKET,SO_REUSEADDR,1) || die "setsockopt に失敗しました。$!"; # ソケットにアドレス(=名前)を割り付ける bind(CLIENT_WAITING,sockaddr_in($server_port,INADDR_ANY)) || die "bind に失敗しました。$!"; # ポートを見張る listen(CLIENT_WAITING,SOMAXCONN) || die "listen: $!"; print "ポート $server_port を見張ります。\n"; # while(1)することで、1つの接続が終っても次の接続に備える while (1){ accept(CLIENT,CLIENT_WAITING); # HTTP プロトコルを使う $port = getservbyname('http','tcp'); # ホスト名を、IP アドレスの構造体に変換 $iaddr = inet_aton("xxx.xxx.xxx.xxx") || die "[xxx.xxx.xxx.xxx]は存在しないホストです。\n"; # ポート番号と IP アドレスを構造体に変換 $sock_addr = sockaddr_in($port,$iaddr); # ソケット生成 socket(SERVER,PF_INET,SOCK_STREAM,0) || die "ソケットを生成できません。\n"; # 指定のホストの指定のポートに接続 connect(SERVER,$sock_addr) || die "[xxx.xxx.xxx.xxx]のポート$portに接続できません。\n"; # ファイルハンドル SERVER をバッファリングしない select(SERVER); $|=1; select(STDOUT); # クライアントに対してバッファリングしない select(CLIENT); $|=1; select(STDOUT); # WWWサーバにHTTPリクエストを送る while (<CLIENT>){ print SERVER "$_"; print "$_"; } # ヘッダ部分を受け取る while (<SERVER>){ # 改行のみの行ならループを抜ける m/^\r\n$/ && last; } # ボディ部分を受け取り、表示 while (<SERVER>){ print CLIENT "$_"; print "$_"; } close(CLIENT); } とりあえず、サンプルをそのまま利用させていただいております。 おかしいところがあればご指摘下さい。 perl初心者のものですみません。 |
簡単に言うと、HTTP proxy とは 1. proxy サーバが localhost:8080 を listen する。 2. ブラウザの proxy の設定を localhost:8080 にする。 3. ブラウザが http://X68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi を読むとき、 GET http://X68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi HTTP/1.0 Host: X68000.startshop.co.jp User-Agent: .... というリクエストを proxy 宛に送る。 4. proxy は X68000.startshop.co.jp:80 に接続し、 GET /~68user/cgi-bin/wwwboard.cgi HTTP/1.0 Host: X68000.startshop.co.jp User-Agent: .... というリクエストを送る。 5. X68000.startshop.co.jp から (proxy に) 返事が返ってきたら、 そのままブラウザに渡す。 を行うプログラムです。とりあえず GET を中継できるように してみて下さい。 |
つるです。 早速のお返事ありがとうございます。 仕組みはだいたいわかるのですが 実際に作ってみるとなると・・・。 ネットワークプログラム初心者には かなりキツイです。 |
> 仕組みはだいたいわかるのですが こう言っちゃなんですが、自分ではわかっているつもりでも、 わかっていないのでしょう。 クライアントからのデータを読まないと、proxy サーバが どこに接続したらよいかは判断できないのに、先に接続 しようとしていますし、 GET http://X68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi HTTP/1.0 を GET /~68user/cgi-bin/wwwboard.cgi HTTP/1.0 に変換する処理もやってません。 ちょっとずつ作ってみて下さい。 |
つるです。 すいません。 説明不足でした。 >クライアントからのデータを読まないと、proxy サーバが >どこに接続したらよいかは判断できないのに、先に接続 >しようとしていますし、 実は、接続先は固定です。(IPアドレス指定です。) 特定のコンテンツサーバに接続しようとしてます。 >GET /~68user/cgi-bin/wwwboard.cgi HTTP/1.0 >に変換する処理もやってません。 ブラウザからのリクエストは GET /~68user/cgi-bin/wwwboard.cgi HTTP/1.0 ・・・ のように来るようにしてます。 そして、そのリクエストを そのまま(操作無しで) 接続先Webサーバに転送しようとしていますので・・・。 すいません、説明不足で・・。 とりあえず、もうちょっとがんばってみます。 参考にするとよいページがあったら 教えてくださると幸いです。 ご迷惑をおかけします。 |
とりあえず 2〜3日悩んでみて下さい。それでも わからなかったらまた質問して下さい。 |
はじめまして。 Solarisのnfsで質問したいのですが。 .nfsAA5A (下4桁はユニークな番号に変化する) というファイルを見たことはありませんか? クライアントマシンからあるシェルを起動すると 勝手に出来てしまって、困っています。 サーバマシン上では出来ないのですが。 心当たりがあれば、なんでも良いので教えて下さい。 |
> .nfsAA5A 昔 消せなくて困りましたが、管理者に聞いたら NFS で トラブルがあった際、作成されるファイルだそうです。 しばらくすれば勝手に消えるとか。 ただし、本当かどうかは知りませんし、どういうトラブルが あったら作成されるのかも知りません。 |
もし FreeBSD と Solaris のNFS まわりのコードがある 程度同じなら (元は同じはずですよね)、 http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/sys/nfs/nfs_vnops.c?rev=1.150 /* * Silly rename. To make the NFS filesystem that is stateless look a little * more like the "ufs" a remove of an active vnode is translated to a rename * to a funny looking filename that is removed by nfs_inactive on the * nfsnode. There is the potential for another process on a different client * to create the same funny name between the nfs_lookitup() fails and the * nfs_rename() completes, but... */ static int nfs_sillyrename(dvp, vp, cnp) ... あたりのようです。 |