プロが教える店舗&オフィスのセキュリティ対策術

JAVA初心者です。
アクセス元のIPアドレスで認証をしているサイトがあり、
httpアクセスでそこから定期的に情報を取ってくるようなものを
JAVAで作っています。
対象サイトは複数あり、それぞれに許可されているIPアドレスは別になるため、socketを使い、IPアドレスをbindしたいのですがうまくいきません。

~~前略~~
Socket socket = new Socket(Host, 80);
bind(socket,"IPアドレス");
~~後略~~

もしくは
~~前略~~
Socket socket = new Socket();
bind(socket,"IPアドレス");
~~後略~~

など、いずれもうまくいきません。なお、クライアントマシンには使用するIPアドレスは全て定義済みです。
また、アクセス元(JAVAが動くPC)のIPアドレスを指定せず
デフォルトのままでアクセスする事自体は
~~前略~~
// Hostの内容はyahoo.co.jp等特にアクセスの制限の無いサイトのもの
Socket socket = new Socket(Host, 80);
~~後略~~
とすることで接続出来ました。

皆さんの知恵を貸していただければと思います。
アドバイスよろしくお願いいたします。

A 回答 (4件)

> ~~処理~~


ここがどうなっているのか分からないので、何とも言えないのですが、
単にBind、Connectするだけなら以下の通りです。

//ホスト名(xxxx)、ポート番号(yy)からアドレスを作る
InetAddress a = InetAddress.getByName("xxxx");
InetSocketAddress b = new InetSocketAddress(a, yy);
//ソケットを作る
Socket s = new Socket();
s.bind(b);  //Bindの例
s.connect(b); //Connectの例

この回答への補足

出来ました。

//ホスト名(xxxx1)、ポート番号(yy1)から自アドレスを作る
InetAddress a = InetAddress.getByName("xxxx1");
InetSocketAddress b = new InetSocketAddress(a, yy);

//ホスト名(xxxx2)、ポート番号(yy2)から接続先アドレスを作る
InetAddress c = InetAddress.getByName("xxxx");
InetSocketAddress d = new InetSocketAddress(c, yy2);

//ソケットを作る
Socket s = new Socket();
s.bind(b);  //Bindの例
s.connect(d); //Connectの例

こういう事がしたかったのですが、
s.bind(b);のところで、bindの使い方を誤っていただけのようです。
ここで
InetSocketAddress d = new InetSocketAddress(c, yy2);
として作成したオブジェクトを使わないといけないというところが
わかっていませんでした。
ありがとうございました。

補足日時:2008/12/12 19:20
    • good
    • 0
この回答へのお礼

ありがとうございます。

この流れで考えている事が出来るか今試してみています。
結果を後ほどご報告します。
よろしくお願いします。

お礼日時:2008/12/12 18:54

もしかして何か勘違いしているかもしれないので確認です。


>対象サイトは複数あり、それぞれに許可されているIPアドレスは別になるため
という件から考えると、もしかしてbindというメソッドでクライアント上に作成したSocketに対して
クライアントのIPアドレスとは別のIPアドレスを使用してサーバーへ接続しようとしているという事ですかね?
であれば、そんなのできません。

単純に言うと
・クライアント上にsocketを作成
・クライアント上のsocketにサーバーのIPアドレス、提供されたポートを接続(bind)
・通信開始
という流れですが、bindという処理を勘違いしてはないでしょうか?

この回答への補足

ここでのbindはソケットに対して自IPアドレス/ポートを割り当てるというつもりでお話しています。

>もしかしてbindというメソッドでクライアント上に作成したSocketに対して
>クライアントのIPアドレスとは別のIPアドレスを使用してサーバーへ接続しようとしているという事ですかね?

クライアントに複数のIPアドレスを割り当てていて、そのいずれかを選択してconnectしたいと考えています。

どうも私の言っている『bind』という言葉が、使い方がおかしいのかもしれませんね。
bindをとにかく使う、というわけではなく、ここでPHPの事を持ち出すのは
おかしいのかもしれませんが、PHPでの
socket_bind
と同様の事が出来ればと考えています。
参考:http://phpspot.net/php/man/php/function.socket-b …

よろしくお願いします。

補足日時:2008/12/12 18:43
    • good
    • 0

ソケット通信ではサーバ側とクライアント側があります。

更に
接続型と非接続型があります。HTTPなので接続型です。この場合、
サーバ側はソケットを作り、ネットワーク内に「サーバXがここに
ある」という宣言をします。これがbindです。この操作は非接続型
でも行います。次いで、クライアントからのconnectを待ち受ける
ため、acceptを行います。acceptは接続型のみ行います。
一方、クライアント側はソケットを作ったあと、サーバにconnect
します。クライアントからのconnectを受け取ると、acceptは制御を
返し、新しいソケットを戻します。以降はサーバ/クライアント双方で
send/receiveでデータをやり取りすることになります。
以上が簡単な説明です。
掲題のプログラムを見ますと、何とアドバイスしたらよいか見当が
つきません。先ず、本を買うとか、"java"+"socket通信"あたりで
ググってみて、通信の仕組みを理解されることを薦めます。
    • good
    • 1
この回答へのお礼

ありがとうございます。
ちなみに、PHPではconnectの際のソースIPアドレスの
指定は実現出来ています。
<?php
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// ソースアドレスをバインドする
socket_bind($sock, 'ソースIPアドレス');
  ~~処理~~
// 閉じる
socket_close($sock);

?>

スレッド化が必要など、言語の選定の段階でどうしてもJAVAにする必要が
あったため、上記と同様の事をJAVAで再現しようと思っています。
既に1週間ほど、ご指定のワードでググって調べていますが
クライアント側のソケット接続に関しては
Socket socket = new Socket( argv[0], PORT );
などとなっており、最近のJAVAではこれで勝手にソースIPやポートが
割り当てられ接続までされてしまうというような内容を見ました。
当然接続してからソースIPアドレスの変更は不可能でしょうから、
空のソケットを作成してから何かしらの割り当て作業をするのかなと思っています。
質問に使っている言葉の使い方(ソースIP)などがそもそも誤っていたらすいません。
よろしくお願いします。

お礼日時:2008/12/12 00:10

Bindというのはサーバ側の処置であって、クライアント側で実行する


ものではありません。
クライアントがサーバに接続したいのであればconnectを使います。
    • good
    • 0
この回答へのお礼

ありがとうございます。

具体的にはどう書けばいいのでしょうか?
connectに関して調べてみましたが、
Socketクラスに関してのドキュメントで

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ …
このクラスは、クライアントソケット (単に「ソケット」とも呼ぶ) を実装します。

とあり、
メソッドの概要に

bind(SocketAddress bindpoint)
ソケットをローカルアドレスにバインドします。

とあるため、クライアント側もソケット接続時にbindで
ソースIPアドレス、ポートを指定出来るものかと認識していました。
よろしくお願いします。

お礼日時:2008/12/11 21:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!