68user's page 掲示板

Prev< No. 729〜739> Next  [最新発言に戻る] [過去ログ一覧]
No. 729 # ハリー 2000/02/16 (水) 09:04
ありがとうございました。
やってみます。

No. 730 # つる 2000/02/16 (水) 09:39
はじめましてつると申します。
ネットワークプログラムについての質問なのですが、
今、いろいろと事情があって
ここのページを参考にプロキシのようなサーバプログラムを
作成しております。
なにをするサーバかというと、ブラウザからのリクエストを受け取り
そのリクエスト(GET,POST)を他のWebサーバにそのまま送りつけ
そのWebサーバからのレスポンス(HTML)を受け取り、
ブラウザに返してやるサーバです。
このページのソースを参考にしています。
サーバ部分はecho-server.plを
httpリクエスト部分はhttp-client.plを利用しましたが、
Webサーバまではリクエストが行っているようですが
レスポンスがうまく表示されません。
なにか原因がわかりになるようでしたら
教えてください。

No. 731 # つる 2000/02/16 (水) 10:32
ソースはこんな感じです。

#!/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初心者のものですみません。

No. 732 # 68user [URL] [E-mail] 2000/02/16 (水) 16:31
簡単に言うと、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 を中継できるように
してみて下さい。

No. 733 # つる 2000/02/16 (水) 16:44
つるです。
早速のお返事ありがとうございます。

仕組みはだいたいわかるのですが
実際に作ってみるとなると・・・。
ネットワークプログラム初心者には
かなりキツイです。

No. 734 # 68user [URL] [E-mail] 2000/02/16 (水) 17:54
> 仕組みはだいたいわかるのですが
こう言っちゃなんですが、自分ではわかっているつもりでも、
わかっていないのでしょう。

クライアントからのデータを読まないと、proxy サーバが
どこに接続したらよいかは判断できないのに、先に接続
しようとしていますし、
    GET http://X68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi HTTP/1.0   

    GET /~68user/cgi-bin/wwwboard.cgi HTTP/1.0
に変換する処理もやってません。

ちょっとずつ作ってみて下さい。

No. 735 # つる 2000/02/16 (水) 18:43
つるです。

すいません。
説明不足でした。

>クライアントからのデータを読まないと、proxy サーバが
>どこに接続したらよいかは判断できないのに、先に接続
>しようとしていますし、

実は、接続先は固定です。(IPアドレス指定です。)
特定のコンテンツサーバに接続しようとしてます。

>GET /~68user/cgi-bin/wwwboard.cgi HTTP/1.0
>に変換する処理もやってません。

ブラウザからのリクエストは
GET /~68user/cgi-bin/wwwboard.cgi HTTP/1.0
・・・
のように来るようにしてます。
そして、そのリクエストを
そのまま(操作無しで)
接続先Webサーバに転送しようとしていますので・・・。

すいません、説明不足で・・。
とりあえず、もうちょっとがんばってみます。
参考にするとよいページがあったら
教えてくださると幸いです。

ご迷惑をおかけします。

No. 736 # 68user [URL] [E-mail] 2000/02/17 (木) 01:09
とりあえず 2〜3日悩んでみて下さい。それでも
わからなかったらまた質問して下さい。

No. 737 # かず*なごや 2000/02/21 (月) 17:47
はじめまして。

Solarisのnfsで質問したいのですが。

.nfsAA5A (下4桁はユニークな番号に変化する)
というファイルを見たことはありませんか?

クライアントマシンからあるシェルを起動すると
勝手に出来てしまって、困っています。
サーバマシン上では出来ないのですが。

心当たりがあれば、なんでも良いので教えて下さい。

No. 738 # 68user [URL] [E-mail] 2000/02/22 (火) 04:45
> .nfsAA5A
昔 消せなくて困りましたが、管理者に聞いたら NFS で
トラブルがあった際、作成されるファイルだそうです。
しばらくすれば勝手に消えるとか。

ただし、本当かどうかは知りませんし、どういうトラブルが
あったら作成されるのかも知りません。

No. 739 # 68user [URL] [E-mail] 2000/02/22 (火) 04:59
もし 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)
    ...
あたりのようです。

Prev< No. 729〜739> Next  [最新発言に戻る] [過去ログ一覧]