HTTPクライアントのソースIPについて

このQ&Aのポイント
  • 複数のIPアドレスを持つサーバで別のHTTPサーバにアクセスするプログラムを作成する方法を教えてください。
  • PHPのfsockopen()やCのsys/socket.hではソースIPを設定する変数が見つからないため、解決策を探しています。
  • JAVAでの解決策についても調べていますが、具体的な解決法は見つかっていません。
回答を見る
  • ベストアンサー

HTTPクライアントでのソースIPについて

よろしくお願いします。 私の持っているサーバは複数のIPアドレスを持っています。 そのIPアドレスを毎回変えながら別のHTTPサーバにアクセスするプログラムを作ろうとしています。 PHPのfsockopen()にはそのような引数は無いようです。 Cで書こうとしたところ、sys/socket.hの構造体を見ても、ソースIPを設定する変数を見つけることができませんでした。 JAVAでも http://forums.sun.com/thread.jspa?threadID=655481&messageID=3853311 のような書き込みはありましたが、結局解決法は出ていないようです。 平行して本でも調べていますが、何かヒントや使うべきライブラリ、方向性などありましたら教えて頂けると大変ありがたく思います。

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

OSが記述されていないので、linux,solaris前提ですが、 bind関数を私用すれば、作成したソケットを自ホストに割り当てることが出来るはずです。connect関数を呼び出す前にこの操作をして下さい。 通常クライアントは、このバインドの操作をする必要がないですが、バインドしても、かまわないはずです。(実際にそのようにして使用した実績はないので自信なしとします) 尚、言語はC言語から呼び出すことを想定しています。(JAVA,PHPからできるかは不明)

satsukima
質問者

お礼

なるほど、bind関数ですね! そこでIPアドレスをひも付けると。 そういえばサーバではやっているようですが、クライアントのソースコードには出てきませんでした、この関数。 ありがとうございます、やってみます!^^

その他の回答 (1)

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.2

??? サーバのIPとHTTP要求(クライアント動作)のIP固定に どう関係があるの? クライアントとして必要なのは 見に行くためのIPで自分側のサーバIPは関係ないんじゃ…

satsukima
質問者

補足

すみません、説明が足りませんでした。 今回私のサーバは、HTTPクライアントとして別のHTTPサーバへアクセスをするのです。 クライアント→私のサーバ→別のサーバ というアクセスの構造になっています。 なので「サーバ」ではなく「HTTPクライアントで送信元IPを指定したいと言うべきだったかもしれませんね。

関連するQ&A

  • プロキシを通ったHTTPリクエストのIP

    LANの中において複数の端末のIPアドレスは、192.168ではじまるケースが多いと思いますが、プロキシサーバを通ったHTTPリクエストのリクエスト元IPアドレスも同じなのでしょうか。それとも、外向けにはまったく違うIPがリクエストにのってゆくのでしょうか。

  • fsockopenでsocket_bindって出来ますか?

    fsockopenでsocket_bindって出来ますか? http://questionbox.jp.msn.com/qa4280167.html で以前あがっていた内容を見て、fsockopenでsocket_bindをしたいと思うのですが うまくいきません。 ソケット関数(socket_connect)を使おうかと思ったのですが、それだとセッション中のタイムアウトは設定できても 接続のタイムアウトが設定出来ないため実用的でないと考えました。 やろうと思っている事は上記のURLの方と同様に複数IPアドレス環境下でのHTTPクライアントの 作成です。 fsockopenでのIPアドレスのバインド、もしくはsocket_createでの接続タイムアウトの方法を ご存知の方いらっしゃいましたらアドバイスをよろしくお願いします。

    • 締切済み
    • PHP
  • プライベートIPからのHTTP通信のしくみ

    プライベートIPを持つPCからHTTPでホームページを見る場合の仕組みについて質問です。 家では一般的な無線LANを使用してインターネットに接続しているため、IPアドレスはプライベートIPアドレス(192.168.xxx.xxx)となっています。 この場合、プライベートIPのPCがグローバルIPを持つ外部サーバにアクセスする場合には、ブロードバンドルータを通過するので、外部サーバはリクエスト元のブロードバンドルータのIPアドレスはわかっても、その先にあるプライベートIPは知らないと理解しています。 そのため、外部サーバはレスポンスをブロードバンドルータのIPアドレスに返却すると考えているのですが、そのレスポンスはどのようにしてグロードバンドルータからリクエスト元のプライベートIPアドレスのPCを判別するのでしょうか? 通信の仕組みを解説しているサイトには、ローカルLANではIPマスカレードなどによって、ポート番号で特定のPCに通信を振り分けることで、ひとつのグローバルIPアドレスに複数のプライベートIPのPCによる通信を実現しているとありますが、自宅のルータの設定をみてもIPマスカレードは設定されていないように見えます。。。 (HTTPは代表的なプロトコルなので、暗黙的にデフォルトで設定されている?) 初歩的な質問ですが、回答や参考になるサイトがあれば教えていただきたいと思います。 よろしくお願いいたします。 OS:Ubuntu 11.10 ブロードバンドルータ:WZR-HP-AG300H

  • HTTPクライアントの作成について

    下のc言語で書かれたプログラムソースは、とあるHPにあったものです。受信して表示するだけですが、実際にコンパイルもでき動作も確認しています。仕組みも大体は理解しているつもりです。このプログラムを改造して、リンクのURLの一覧のみ表示させるには、どのように改造すればよいのでしょうか?それとも、根本的に仕組みが異なるのでしょうか?詳しくご指導いただけるとありがたいです。そのHPのURLものせておきます。よろしくお願いします。 URL:http://x68000.q-e-d.net/~68user/net/c-http-1.html ※includeは省略しています。 #define BUF_LEN 256 /*バッファのサイズ */ int main(int argc, char *argv[]){ int s; /*ソケットのためのファイルディスクリプタ */ struct hostent *servhost; /*ホスト名と IP アドレスを扱うための構造体 */ struct sockaddr_in server; /*ソケットを扱うための構造体 */ struct servent *service; /*サービス (http など) を扱うための構造体 */ char send_buf[BUF_LEN]; /* サーバに送るHTTP プロトコル用バッファ */ char host[BUF_LEN] = "localhost"; /*接続するホスト名 */ char path[BUF_LEN] = "/"; /*要求するパス */ unsigned short port = 0; /*接続するポート番号 */ if ( argc > 1 ){ /*URLが指定されていたら */ char host_path[BUF_LEN]; if ( strlen(argv[1]) > BUF_LEN -1 ){ fprintf(stderr, "URL が長すぎます。\n"); return 1; } /*http:// から始まる文字列で */ /*sscanf が成功して */ /*http:// の後に何か文字列が存在するなら */ if ( strstr(argv[1], "http://") && sscanf(argv[1], "http://%s", h ost_path) && strcmp(argv[1], "http://") ){ char *p; p = strchr(host_path, '/'); /* ホストとパスの区切り "/" を調べる */ if ( p != NULL ){ strcpy(path, p);/*"/"以降の文字列を path にコピー */ *p = '\0'; strcpy(host, host_path ); /*"/"より前の文字列を host にコピー */ } else {/*"/"がないなら=http://host という引数なら */ strcpy(host, host_path); /*文字列全体を host にコピー */ } p = strchr(host, ':'); /*ホスト名の部分に ":" が含まれていたら */ if ( p != NULL ){ port = atoi(p+1); /*ポート番号を取得 */ if ( port <= 0 ){ /*数字でない (atoi が失敗)か、0だったら */ port = 80; /*ポート番号は 80 に決め打ち */ } *p = '\0'; } } else { fprintf(stderr, "URLはhttp://host/path の形式で指定してください。\n"); return 1; } } printf("http://%s%s を取得します。\n\n",host, path); /* ホストの情報(IPアドレスなど)を取得 */ servhost = gethostbyname(host); if ( servhost == NULL ){ fprintf(stderr, "[%s] から IPアドレスへの変換に失敗しました。\n", host); return 0; } bzero(&server, sizeof(server));  /* 構造体をゼロクリア */ server.sin_family = AF_INET; /* IPアドレスを示す構造体をコピー */ bcopy(servhost->h_addr, &server.sin_add r,servhost->h_length); if ( port != 0 ){/* 引数でポート番号が指定されていたら */ server.sin_port = htons(port); } else {/* そうでないなら getservbyname でポート番号を取得 */ service = getservbyname("http", "tcp"); if ( service != NULL ){  /* 成功したらポート番号をコピー */ server.sin_port = service->s_port; } else { /* 失敗したら 80 番に決め打ち */ server.sin_port = htons(80); } } /* ソケット生成 */ if ( ( s = socket(AF_INET, SOCK_STREAM, 0) ) < 0 ){ fprintf(stderr, "ソケットの生成に失敗しました。\n"); return 1; } /* サーバに接続 */ if ( connect(s, (struct sockaddr *)&ser ver, sizeof(server)) == -1 ){ fprintf(stderr, "connectに失敗しました。\n"); return 1; } /* HTTP プロトコル生成 & サーバに送信 */ sprintf(send_buf, "GET %s HTTP/1.0\r\n" , path); write(s, send_buf, strlen(send_buf)); sprintf(send_buf, "Host: %s:%d\r\n", ho st, port); write(s, send_buf, strlen(send_buf)); sprintf(send_buf, "\r\n"); write(s, send_buf, strlen(send_buf)); /* あとは受信して、表示するだけ */ while (1){ char buf[BUF_LEN]; int read_size; read_size = read(s, buf, BUF_LEN); if ( read_size > 0 ){ write(1, buf, read_size); } else { break; } } /* 後始末 */ close(s); return 0; }

  • アマゾンAPI(AWS)の利用制限について

    アマゾンAPI(AWS)の利用制限について アマゾンAPIの利用制限で、「IPアドレスごとに毎秒1コールを超えないアクセス」があるのですが、 http://developer.amazonwebservices.com/connect/thread.jspa?messageID=41215 レンタルサーバーに設置したPHPプログラム内の file_get_contents からAPIを参照した場合、参照元としてカウントされるのは設置したレンタルサーバーのIPなのでしょうか? それとも、ページを参照したユーザーのIPアドレスなのでしょうか? 自前で $_SERVER['REMOTE_ADDR'] を使用して、APIの動作を擬似的に真似て調べてみたのですが、 file_get_contents された側の $_SERVER['REMOTE_ADDR'] には、 file_get_contents したレンタルサーバーのIPが入っていました。 レンタルサーバーのIPがカウントされる場合、同時に複数人がページを見ていた場合にアウトですので、スタック等を各自実装する。という感じなのでしょうか? 宜しくご指導をお願い申し上げます。

    • ベストアンサー
    • PHP
  • IPアドレスについて

    ネットワークの知識がほとんどありません。 取引先の会社のサーバーにアクセスしてデータの納品を行うことになりました。 固定IPアドレスが必要だということでISPに発行(?)してもらう手続きを取りました。 そして取引先にサーバーの利用申請書をださなければならないのですがそこに書かれているのが ・FTP用IPアドレス ・HTTP用IPアドレス とあります。 FTP,HTTPはコンピューター間のやりとりのためのプロトコルであるということはしっているのですが…。 取引先の方に確認をとれるのが来週になってしまうのでどうにかこちらで調べられないものかと思い質問しました。 すみません。 わかる方がいらっしゃいましたらご回答よろしくお願いします。

  • なぜHTTP_X_FORWARDED_FORで

    function isproxy() { return (isset($_SERVER['HTTP_VIA']) || isset($_SERVER['CLIENT_IP']) || isset($_SERVER['HTTP_X_FORWARDED_FOR'])); } $msg = isproxy() ? 'プロキシ経由である' : 'プロキシ経由ではない'; なぜ上記のソースでプロキシだと判断できるのかが分かりません。 前の二つの変数はまだわかるんですが、HTTP_X_FORWARDED_FORについてはプロキシでなくてもセットされて生のIPアドレスが収納されますよね。 functionのところで、三つの内一つでも変数が存在するならTrueを返せってことですよね? その下のクエスチョンとコロンで作られた式がよく分かりませんが、おそらく関数で返ってきた値を判断してクエスチョンの後に書かれたものを結果とするものだと思います。 コロンを挟んで左側がTrueだった場合、右側がFalseだった場合の結果ですよね。 問題はこの関数ですが、プロキシ経由だろうと生だろうと、Trueを返すのではないでしょうか? というのも、HTTP_X_FORWARDED_FORはプロキシ経由じゃなくてもセットされて生アドレスが収納されますよね? 実際、確かめてみたところ、プロキシでアクセスすればプロキシのアドレスが、生でアクセスすれば生アドレスが収納されており、どちらにせよHTTP_X_FORWARDED_FORはセットされていました。 これじゃどちらでも「プロキシ経由である」と出ると思ってたら、ちゃんと生のときは「プロキシ経由ではない」と出ました。 何か僕の解釈は間違えているのでしょうか? 試したプロキシは匿名性が高いとされているもので、HTTP_X_FORWARDED_FORの中で通常、カンマを挟んでいくつかアドレスが収納されるのに対して、このプロキシでは生の時みたいに一つしか収納されないので、アドレスの数で判断はできないと思います。 また、HTTP_VIAとCLIENT_IPはセットされておりませんでした。 これでなぜプロキシ経由だと判断できるのでしょう?

    • 締切済み
    • PHP
  • IPアドレスとサーバ名の変更

    SunのSparc Station 5上のSolarisですが、IPアドレスとサーバ名の変更をするにはどうしたらよろしいでしょうか。

  • Postfixのスレッドごとに別々のIPアドレスを設定するには

    Postfixを使用してリレーメールサーバの開発を行っております。 そこで質問なのですが、Postfixのプロセスを1つ起動し、メール送信時に そのプロセス上のスレッドごとに違うIPを設定することは出来ますでしょうか? 以下のようなイメージになります。 ※IPは仮称です。 Postfix ├─Thread1(122.216.137.92) ├─Thread2(122.216.137.93) ├─Thread3(122.216.137.94) ├─Thread4(122.216.137.95) ├─Thread5(122.216.137.96) ├─Thread6(122.216.137.97) ├─Thread7(122.216.137.98) ├─Thread8(122.216.137.99) また、上記以外にも1つのPostfixプロセスでIPアドレスを変更しながらメールを 送信する手法はありますでしょうか? サーバは以下の構成です。 OS: Ledhat ES4 MTA: Postfix2.5 NICは2ポート空いております。 以上、宜しくお願い致します。

  • インターネットに接続しないサーバ・クライアントシステム

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=1897065 をしている内にあきらめてBBルータを購入しました. 次のようなネットワーク、サーバクライアントシステムを作りたいですが問題ないでしょうか? 1. ルータはインターネット、サーバ、クライアントの接点になっている 2. サーバ、クライアントは夫々一台ずつある 3. ISPから非固定のローカルIPが与えられていてそれを使ってインターネットに接続するようになっている 4. ネットワークのアドレスを192.168.0.0/24   ルータ機のIPアドレスを 192.168.0.1   サーバ機のIPアドレスを 192.168.0.2   クライアント機のIPアドレスを 192.168.0.101   ドメインネームは設定しない 5. SSHの構築 6. HTTPの構築 (7. スーパーサーバの構築) 3.の(非固定の)ローカルIPしか与えられない所に問題があると思いますが如何でしょうか? また、設定なども含め、他に必要なことはあるでしょうか?

専門家に質問してみよう